@netless/window-manager 0.3.17 → 0.4.0-canary.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .netless-window-manager-playground{width:100%;height:100%;position:relative;z-index:1;overflow:hidden;user-select:none}.netless-window-manager-sizer{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1;overflow:hidden;display:flex}.netless-window-manager-sizer-horizontal{flex-direction:column}.netless-window-manager-sizer:before,.netless-window-manager-sizer:after{flex:1;content:"";display:block}.netless-window-manager-chess-sizer:before,.netless-window-manager-chess-sizer:after{background-image:linear-gradient(45deg,#b0b0b0 25%,transparent 25%),linear-gradient(-45deg,#b0b0b0 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#b0b0b0 75%),linear-gradient(-45deg,transparent 75%,#b0b0b0 75%);background-color:#fff;background-size:20px 20px;background-position:0 0,0 10px,10px -10px,-10px 0px}.netless-window-manager-wrapper{position:relative;z-index:1;width:100%;height:100%;overflow:hidden}.netless-window-manager-main-view{width:100%;height:100%}.netless-window-manager-cursor-pencil-image{width:26px;height:26px}.netless-window-manager-cursor-eraser-image{width:26px;height:26px}.netless-window-manager-cursor-selector-image{width:24px;height:24px}.netless-window-manager-cursor-selector-avatar{border-radius:50%;border-style:solid;border-width:2px;border-color:#fff;margin-bottom:2px}.netless-window-manager-cursor-selector-avatar img{width:12px}.netless-window-manager-cursor-inner{border-radius:4px;display:flex;align-items:center;justify-content:center;flex-direction:row;padding-left:4px;padding-right:4px;font-size:12px}.netless-window-manager-cursor-inner-mellow{height:32px;border-radius:16px;display:flex;align-items:center;justify-content:center;flex-direction:row;padding-left:16px;padding-right:16px}.netless-window-manager-cursor-tag-name{font-size:12px;margin-left:4px;padding:2px 8px;border-radius:4px}.netless-window-manager-cursor-mid{display:flex;flex-direction:column;align-items:center;justify-content:center;position:fixed;width:26px;height:26px;z-index:2147483647;left:0;top:0;will-change:transform;transition:transform .05s;transform-origin:0 0;user-select:none}.netless-window-manager-cursor-pencil-offset{margin-left:-20px}.netless-window-manager-cursor-selector-offset{margin-left:-22px;margin-top:56px}.netless-window-manager-cursor-text-offset{margin-left:-30px;margin-top:18px}.netless-window-manager-cursor-shape-offset{display:flex;flex-direction:column;align-items:center;justify-content:center;position:absolute;width:180px;height:64px;margin-left:-30px;margin-top:12px}.netless-window-manager-cursor-name{width:100%;height:48px;display:flex;align-items:center;justify-content:center;position:absolute;top:-40px}.cursor-image-wrapper{display:flex;justify-content:center}.tele-fancy-scrollbar{overscroll-behavior:contain;overflow:auto;overflow-y:scroll;overflow-y:overlay;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;scrollbar-width:auto}.tele-fancy-scrollbar::-webkit-scrollbar{height:8px;width:8px}.tele-fancy-scrollbar::-webkit-scrollbar-track{background-color:transparent}.tele-fancy-scrollbar::-webkit-scrollbar-thumb{background-color:#444e601a;background-color:transparent;border-radius:4px;transition:background-color .4s}.tele-fancy-scrollbar:hover::-webkit-scrollbar-thumb{background-color:#444e601a}.tele-fancy-scrollbar::-webkit-scrollbar-thumb:hover{background-color:#444e6033}.tele-fancy-scrollbar::-webkit-scrollbar-thumb:active{background-color:#444e6033}.tele-fancy-scrollbar::-webkit-scrollbar-thumb:vertical{min-height:50px}.tele-fancy-scrollbar::-webkit-scrollbar-thumb:horizontal{min-width:50px}.telebox-box{position:absolute;top:0;left:0;z-index:100;will-change:transform;transition:width .4s cubic-bezier(.4,.9,.71,1.02),height .4s cubic-bezier(.55,.82,.63,.95),opacity .6s cubic-bezier(.7,0,.84,0),transform .4s ease}.telebox-box-main{position:relative;width:100%;height:100%;display:flex;flex-direction:column;overflow:hidden;background:#f9f9fc;box-shadow:0 4px 10px #2f419226;border-radius:6px;border:1px solid #e3e3ec}.telebox-titlebar-wrap{flex-shrink:0;position:relative;z-index:1}.telebox-content-wrap{flex:1;width:100%;overflow:hidden;display:flex;justify-content:center;align-items:center}.telebox-content{width:100%;height:100%;position:relative}.telebox-footer-wrap{flex-shrink:0;display:flex;flex-direction:column}.telebox-footer-wrap:before{content:"";display:block;flex:1}.telebox-resize-handle{position:absolute;z-index:2147483647}.telebox-n{width:100%;height:5px;left:0;top:-5px;cursor:n-resize}.telebox-s{width:100%;height:5px;left:0;bottom:-5px;cursor:s-resize}.telebox-w{width:5px;height:100%;left:-5px;top:0;cursor:w-resize}.telebox-e{width:5px;height:100%;right:-5px;top:0;cursor:e-resize}.telebox-nw{width:15px;height:15px;top:-5px;left:-5px;cursor:nw-resize}.telebox-ne{width:15px;height:15px;top:-5px;right:-5px;cursor:ne-resize}.telebox-se{width:15px;height:15px;bottom:-5px;right:-5px;cursor:se-resize}.telebox-sw{width:15px;height:15px;bottom:-5px;left:-5px;cursor:sw-resize}.telebox-track-mask{position:fixed;top:0;left:0;z-index:2147483647;width:100%;height:100%;background:rgba(0,0,0,.0001);cursor:move}.telebox-cursor-n{cursor:n-resize}.telebox-cursor-s{cursor:s-resize}.telebox-cursor-w{cursor:w-resize}.telebox-cursor-e{cursor:e-resize}.telebox-cursor-nw{cursor:nw-resize}.telebox-cursor-ne{cursor:ne-resize}.telebox-cursor-se{cursor:se-resize}.telebox-cursor-sw{cursor:sw-resize}.telebox-maximized .telebox-resize-handles,.telebox-no-resize .telebox-resize-handles{display:none}.telebox-maximized{box-shadow:none;transition:none}.telebox-minimized{will-change:transform;transition:width 50ms cubic-bezier(.4,.9,.71,1.02),height 50ms cubic-bezier(.55,.82,.63,.95),opacity .6s cubic-bezier(.7,0,.84,0),transform .6s ease;opacity:0;pointer-events:none;user-select:none}.telebox-transforming{will-change:transform;transition:opacity .6s cubic-bezier(.7,0,.84,0)}.telebox-readonly .telebox-resize-handle{cursor:initial!important;pointer-events:none!important}.telebox-color-scheme-dark .telebox-box-main{color:#e9e9e9;background:#212126;border-color:#43434d}.telebox-titlebar{box-sizing:border-box;height:26px;display:flex;align-items:center;padding:0 16px;background:#fff;user-select:none;border-bottom:1px solid #eeeef7}.telebox-title{overflow:hidden;margin:0 24px 0 0;padding:0;font-size:14px;font-weight:400;font-family:PingFangSC-Regular,PingFang SC;white-space:nowrap;word-break:keep-all;text-overflow:ellipsis;color:#191919}.telebox-titlebar-btns{white-space:nowrap;word-break:keep-all;margin-left:auto;font-size:0}.telebox-titlebar-btn{width:22px;height:22px;padding:0;outline:0;border:none;background:0 0;cursor:pointer}.telebox-titlebar-btn~.telebox-titlebar-btn{margin-left:10px}.telebox-titlebar-btn-icon{width:22px;height:22px}.telebox-readonly .telebox-titlebar-btn{cursor:not-allowed}.telebox-titlebar-icon-minimize{background:center/cover no-repeat url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMjggMjgiPgogICAgPGRlZnM+CiAgICAgICAgPHBhdGggaWQ9ImEiIGQ9Ik0wIDBoMjh2MjhIMHoiIC8+CiAgICA8L2RlZnM+CiAgICA8ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxtYXNrIGlkPSJiIiBmaWxsPSIjZmZmIj4KICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjYSIgLz4KICAgICAgICA8L21hc2s+CiAgICAgICAgPHBhdGggZmlsbD0iI0E3QTdDQSIgZmlsbC1ydWxlPSJub256ZXJvIiBkPSJNOSAxM2gxMHYxLjZIOXoiIG1hc2s9InVybCgjYikiIC8+CiAgICA8L2c+Cjwvc3ZnPgo=)}.telebox-titlebar-icon-maximize{background:center/cover no-repeat url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMjggMjgiPgogICAgPGRlZnM+CiAgICAgICAgPHBhdGggaWQ9ImEiIGQ9Ik0wIDBoMjh2MjhIMHoiIC8+CiAgICA8L2RlZnM+CiAgICA8ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxtYXNrIGlkPSJiIiBmaWxsPSIjZmZmIj4KICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjYSIgLz4KICAgICAgICA8L21hc2s+CiAgICAgICAgPGcgZmlsbD0iI0E3QTdDQSIgZmlsbC1ydWxlPSJub256ZXJvIiBtYXNrPSJ1cmwoI2IpIj4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICAgIGQ9Ik0yMC40ODEgMTcuMWgxLjJ2NC41ODFIMTcuMXYtMS4yaDMuMzgxVjE3LjF6bS0xNC4xOTA1LS4wMDloMS4ydjMuMzgxaDMuMzgwOXYxLjJoLTQuNTgxdi00LjU4MXpNMTcuMSA2LjE5MDVoNC41ODF2NC41ODA5aC0xLjJ2LTMuMzgxSDE3LjF2LTEuMnptLTEwLjcwMDguMTA4N2g0Ljc5ODV2MS4ySDcuNTk5MnYzLjU5ODVoLTEuMlY2LjI5OTJ6IiAvPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+Cg==)}.telebox-titlebar-icon-maximize.is-active{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMjggMjgiPgogICAgPGRlZnM+CiAgICAgICAgPHBhdGggaWQ9ImEiIGQ9Ik0wIDBoMjZ2MjZIMHoiIC8+CiAgICAgICAgPHBhdGggaWQ9ImMiIGQ9Ik0yNi44NjkgMEwyOCAxLjEzMVYyNi44N0wyNi44NjkgMjhIMS4xM0wwIDI2Ljg3VjEuMTMxTDEuMTMgMHoiIC8+CiAgICA8L2RlZnM+CiAgICA8ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEgMSkiPgogICAgICAgICAgICA8bWFzayBpZD0iYiIgZmlsbD0iI2ZmZiI+CiAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNhIiAvPgogICAgICAgICAgICA8L21hc2s+CiAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0tNC42NDI5LTQuNjQyOWgzNS4yODU4djM1LjI4NThILTQuNjQyOXoiIG1hc2s9InVybCgjYikiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnPgogICAgICAgICAgICA8bWFzayBpZD0iZCIgZmlsbD0iI2ZmZiI+CiAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNjIiAvPgogICAgICAgICAgICA8L21hc2s+CiAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0tMTcuNTE2OCAxNEwxNC0xNy41MTY4IDQ1LjUxNjggMTQgMTQgNDUuNTE2OHoiIG1hc2s9InVybCgjZCkiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxwYXRoIHN0cm9rZT0iI0E3QTdDQSIgc3Ryb2tlLXdpZHRoPSIxLjIiCiAgICAgICAgICAgIGQ9Ik0xMC4wODg2IDIxLjQ4NjV2LTMuNjk2Nkg2LjM5Mk0yMS4zODU1IDEwLjE4OTVoLTMuNjk2NlY2LjQ5M00yMS40MDIgMTcuNzk4M2gtMy42OTY2djMuNjk2Nk0xMC4yNTAzIDYuMTQ5OHYzLjg5ODVINi4zNTE3IiAvPgogICAgPC9nPgo8L3N2Zz4K)}.telebox-titlebar-icon-close{background:center/cover no-repeat url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyOCAyOCI+CiAgICA8ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iI0E3QTdDQSIgc3Ryb2tlLXdpZHRoPSIxLjQiPgogICAgICAgIDxwYXRoIGQ9Ik04LjM1MyAyMC4zMzIxTDIwLjMzMiA4LjM1M00yMC4zMzIyIDIwLjMzMjFMOC4zNTMgOC4zNTMiIC8+CiAgICA8L2c+Cjwvc3ZnPgo=)}.telebox-color-scheme-dark .telebox-titlebar{color:#e9e9e9;background:#43434d;border-bottom:none}.telebox-collector{visibility:hidden;display:block;position:absolute;z-index:200;width:40px;height:40px;margin:0;padding:0;border:none;outline:0;font-size:0;border-radius:50%;background:#fff;box-shadow:0 2px 6px #2f419226;cursor:pointer;user-select:none;pointer-events:none;background-repeat:no-repeat;background-size:18px 16px;background-position:center}.telebox-collector-visible{visibility:visible;pointer-events:initial}.telebox-collector-readonly{cursor:not-allowed}.telebox-color-scheme-dark.telebox-collector{background-color:#43434d}.telebox-max-titlebar{display:none;position:absolute;top:0;left:0;z-index:50000;user-select:none}.telebox-max-titlebar-maximized{display:flex}.telebox-titles{flex:1;height:100%;margin:0 16px 0 -16px;overflow-y:hidden;overflow-x:scroll;overflow-x:overlay;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;scrollbar-width:auto}.telebox-titles::-webkit-scrollbar{height:8px;width:8px}.telebox-titles::-webkit-scrollbar-track{background-color:transparent}.telebox-titles::-webkit-scrollbar-thumb{background-color:#eeeef7cc;background-color:transparent;border-radius:4px;transition:background-color .4s}.telebox-titles:hover::-webkit-scrollbar-thumb{background-color:#eeeef7cc}.telebox-titles::-webkit-scrollbar-thumb:hover{background-color:#eeeef7}.telebox-titles::-webkit-scrollbar-thumb:active{background-color:#eeeef7}.telebox-titles::-webkit-scrollbar-thumb:vertical{min-height:50px}.telebox-titles::-webkit-scrollbar-thumb:horizontal{min-width:50px}.telebox-titles-content{height:100%;display:flex;flex-wrap:nowrap;align-items:center;padding:0}.telebox-titles-tab{overflow:hidden;max-width:182px;min-width:50px;padding:0 26px 0 16px;outline:0;font-size:13px;font-family:PingFangSC-Regular,PingFang SC;font-weight:400;text-overflow:ellipsis;white-space:nowrap;word-break:keep-all;border:none;border-right:1px solid #e5e5f0;color:#7b88a0;background:0 0;cursor:pointer}.telebox-titles-tab~.telebox-titles-tab{margin-left:2px}.telebox-titles-tab-focus{color:#357bf6}.telebox-readonly .telebox-titles-tab{cursor:not-allowed}.telebox-color-scheme-dark{color-scheme:dark}.telebox-color-scheme-dark.telebox-titlebar{color:#e9e9e9;background:#43434d;border-bottom:none}.telebox-color-scheme-dark .telebox-titles-tab{border-right-color:#7b88a0}.telebox-color-scheme-dark .telebox-title{color:#e9e9e9}
1
+ .netless-window-manager-playground{width:100%;height:100%;position:relative;z-index:1;overflow:hidden;user-select:none}.netless-window-manager-sizer{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1;overflow:hidden;display:flex}.netless-window-manager-sizer-horizontal{flex-direction:column}.netless-window-manager-sizer:before,.netless-window-manager-sizer:after{flex:1;content:"";display:block}.netless-window-manager-chess-sizer:before,.netless-window-manager-chess-sizer:after{background-image:linear-gradient(45deg,#b0b0b0 25%,transparent 25%),linear-gradient(-45deg,#b0b0b0 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#b0b0b0 75%),linear-gradient(-45deg,transparent 75%,#b0b0b0 75%);background-color:#fff;background-size:20px 20px;background-position:0 0,0 10px,10px -10px,-10px 0px}.netless-window-manager-wrapper{position:relative;z-index:1;width:100%;height:100%;overflow:hidden}.netless-window-manager-main-view{width:100%;height:100%}.netless-window-manager-cursor-pencil-image{width:26px;height:26px}.netless-window-manager-cursor-eraser-image{width:26px;height:26px}.netless-window-manager-cursor-selector-image{width:24px;height:24px}.netless-window-manager-cursor-selector-avatar{border-radius:50%;border-style:solid;border-width:2px;border-color:#fff;margin-bottom:2px}.netless-window-manager-cursor-selector-avatar img{width:12px}.netless-window-manager-cursor-inner{border-radius:4px;display:flex;align-items:center;justify-content:center;flex-direction:row;padding-left:4px;padding-right:4px;font-size:12px}.netless-window-manager-cursor-inner-mellow{height:32px;border-radius:16px;display:flex;align-items:center;justify-content:center;flex-direction:row;padding-left:16px;padding-right:16px}.netless-window-manager-cursor-tag-name{font-size:12px;margin-left:4px;padding:2px 8px;border-radius:4px}.netless-window-manager-cursor-mid{display:flex;flex-direction:column;align-items:center;justify-content:center;position:absolute;width:26px;height:26px;z-index:2147483647;left:0;top:0;will-change:transform;transition:transform .05s;transform-origin:0 0;user-select:none}.netless-window-manager-cursor-pencil-offset{margin-left:-20px}.netless-window-manager-cursor-selector-offset{margin-left:-22px;margin-top:56px}.netless-window-manager-cursor-text-offset{margin-left:-30px;margin-top:18px}.netless-window-manager-cursor-shape-offset{display:flex;flex-direction:column;align-items:center;justify-content:center;position:absolute;width:180px;height:64px;margin-left:-30px;margin-top:12px}.netless-window-manager-cursor-name{width:100%;height:48px;display:flex;align-items:center;justify-content:center;position:absolute;top:-40px}.cursor-image-wrapper{display:flex;justify-content:center}.tele-fancy-scrollbar{overscroll-behavior:contain;overflow:auto;overflow-y:scroll;overflow-y:overlay;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;scrollbar-width:auto}.tele-fancy-scrollbar::-webkit-scrollbar{height:8px;width:8px}.tele-fancy-scrollbar::-webkit-scrollbar-track{background-color:transparent}.tele-fancy-scrollbar::-webkit-scrollbar-thumb{background-color:#444e601a;background-color:transparent;border-radius:4px;transition:background-color .4s}.tele-fancy-scrollbar:hover::-webkit-scrollbar-thumb{background-color:#444e601a}.tele-fancy-scrollbar::-webkit-scrollbar-thumb:hover{background-color:#444e6033}.tele-fancy-scrollbar::-webkit-scrollbar-thumb:active{background-color:#444e6033}.tele-fancy-scrollbar::-webkit-scrollbar-thumb:vertical{min-height:50px}.tele-fancy-scrollbar::-webkit-scrollbar-thumb:horizontal{min-width:50px}.telebox-box{position:absolute;top:0;left:0;z-index:100;will-change:transform;transition:width .4s cubic-bezier(.4,.9,.71,1.02),height .4s cubic-bezier(.55,.82,.63,.95),opacity .6s cubic-bezier(.7,0,.84,0),transform .4s ease}.telebox-box-main{position:relative;width:100%;height:100%;display:flex;flex-direction:column;overflow:hidden;background:#f9f9fc;box-shadow:0 4px 10px #2f419226;border-radius:6px;border:1px solid #e3e3ec}.telebox-titlebar-wrap{flex-shrink:0;position:relative;z-index:1}.telebox-content-wrap{flex:1;width:100%;overflow:hidden;display:flex;justify-content:center;align-items:center}.telebox-content{width:100%;height:100%;position:relative}.telebox-footer-wrap{flex-shrink:0;display:flex;flex-direction:column}.telebox-footer-wrap:before{content:"";display:block;flex:1}.telebox-resize-handle{position:absolute;z-index:2147483647}.telebox-n{width:100%;height:5px;left:0;top:-5px;cursor:n-resize}.telebox-s{width:100%;height:5px;left:0;bottom:-5px;cursor:s-resize}.telebox-w{width:5px;height:100%;left:-5px;top:0;cursor:w-resize}.telebox-e{width:5px;height:100%;right:-5px;top:0;cursor:e-resize}.telebox-nw{width:15px;height:15px;top:-5px;left:-5px;cursor:nw-resize}.telebox-ne{width:15px;height:15px;top:-5px;right:-5px;cursor:ne-resize}.telebox-se{width:15px;height:15px;bottom:-5px;right:-5px;cursor:se-resize}.telebox-sw{width:15px;height:15px;bottom:-5px;left:-5px;cursor:sw-resize}.telebox-track-mask{position:fixed;top:0;left:0;z-index:2147483647;width:100%;height:100%;background:rgba(0,0,0,.0001);cursor:move}.telebox-cursor-n{cursor:n-resize}.telebox-cursor-s{cursor:s-resize}.telebox-cursor-w{cursor:w-resize}.telebox-cursor-e{cursor:e-resize}.telebox-cursor-nw{cursor:nw-resize}.telebox-cursor-ne{cursor:ne-resize}.telebox-cursor-se{cursor:se-resize}.telebox-cursor-sw{cursor:sw-resize}.telebox-maximized .telebox-resize-handles,.telebox-no-resize .telebox-resize-handles{display:none}.telebox-maximized{box-shadow:none;transition:none}.telebox-minimized{will-change:transform;transition:width 50ms cubic-bezier(.4,.9,.71,1.02),height 50ms cubic-bezier(.55,.82,.63,.95),opacity .6s cubic-bezier(.7,0,.84,0),transform .6s ease;opacity:0;pointer-events:none;user-select:none}.telebox-transforming{will-change:transform;transition:opacity .6s cubic-bezier(.7,0,.84,0)}.telebox-readonly .telebox-resize-handle{cursor:initial!important;pointer-events:none!important}.telebox-color-scheme-dark .telebox-box-main{color:#e9e9e9;background:#212126;border-color:#43434d}.telebox-titlebar{box-sizing:border-box;height:26px;display:flex;align-items:center;padding:0 16px;background:#fff;user-select:none;border-bottom:1px solid #eeeef7}.telebox-title{overflow:hidden;margin:0 24px 0 0;padding:0;font-size:14px;font-weight:400;font-family:PingFangSC-Regular,PingFang SC;white-space:nowrap;word-break:keep-all;text-overflow:ellipsis;color:#191919}.telebox-titlebar-btns{white-space:nowrap;word-break:keep-all;margin-left:auto;font-size:0}.telebox-titlebar-btn{width:22px;height:22px;padding:0;outline:0;border:none;background:0 0;cursor:pointer}.telebox-titlebar-btn~.telebox-titlebar-btn{margin-left:10px}.telebox-titlebar-btn-icon{width:22px;height:22px}.telebox-readonly .telebox-titlebar-btn{cursor:not-allowed}.telebox-titlebar-icon-minimize{background:center/cover no-repeat url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMjggMjgiPgogICAgPGRlZnM+CiAgICAgICAgPHBhdGggaWQ9ImEiIGQ9Ik0wIDBoMjh2MjhIMHoiIC8+CiAgICA8L2RlZnM+CiAgICA8ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxtYXNrIGlkPSJiIiBmaWxsPSIjZmZmIj4KICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjYSIgLz4KICAgICAgICA8L21hc2s+CiAgICAgICAgPHBhdGggZmlsbD0iI0E3QTdDQSIgZmlsbC1ydWxlPSJub256ZXJvIiBkPSJNOSAxM2gxMHYxLjZIOXoiIG1hc2s9InVybCgjYikiIC8+CiAgICA8L2c+Cjwvc3ZnPgo=)}.telebox-titlebar-icon-maximize{background:center/cover no-repeat url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMjggMjgiPgogICAgPGRlZnM+CiAgICAgICAgPHBhdGggaWQ9ImEiIGQ9Ik0wIDBoMjh2MjhIMHoiIC8+CiAgICA8L2RlZnM+CiAgICA8ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxtYXNrIGlkPSJiIiBmaWxsPSIjZmZmIj4KICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjYSIgLz4KICAgICAgICA8L21hc2s+CiAgICAgICAgPGcgZmlsbD0iI0E3QTdDQSIgZmlsbC1ydWxlPSJub256ZXJvIiBtYXNrPSJ1cmwoI2IpIj4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICAgIGQ9Ik0yMC40ODEgMTcuMWgxLjJ2NC41ODFIMTcuMXYtMS4yaDMuMzgxVjE3LjF6bS0xNC4xOTA1LS4wMDloMS4ydjMuMzgxaDMuMzgwOXYxLjJoLTQuNTgxdi00LjU4MXpNMTcuMSA2LjE5MDVoNC41ODF2NC41ODA5aC0xLjJ2LTMuMzgxSDE3LjF2LTEuMnptLTEwLjcwMDguMTA4N2g0Ljc5ODV2MS4ySDcuNTk5MnYzLjU5ODVoLTEuMlY2LjI5OTJ6IiAvPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+Cg==)}.telebox-titlebar-icon-maximize.is-active{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMjggMjgiPgogICAgPGRlZnM+CiAgICAgICAgPHBhdGggaWQ9ImEiIGQ9Ik0wIDBoMjZ2MjZIMHoiIC8+CiAgICAgICAgPHBhdGggaWQ9ImMiIGQ9Ik0yNi44NjkgMEwyOCAxLjEzMVYyNi44N0wyNi44NjkgMjhIMS4xM0wwIDI2Ljg3VjEuMTMxTDEuMTMgMHoiIC8+CiAgICA8L2RlZnM+CiAgICA8ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEgMSkiPgogICAgICAgICAgICA8bWFzayBpZD0iYiIgZmlsbD0iI2ZmZiI+CiAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNhIiAvPgogICAgICAgICAgICA8L21hc2s+CiAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0tNC42NDI5LTQuNjQyOWgzNS4yODU4djM1LjI4NThILTQuNjQyOXoiIG1hc2s9InVybCgjYikiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnPgogICAgICAgICAgICA8bWFzayBpZD0iZCIgZmlsbD0iI2ZmZiI+CiAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNjIiAvPgogICAgICAgICAgICA8L21hc2s+CiAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0tMTcuNTE2OCAxNEwxNC0xNy41MTY4IDQ1LjUxNjggMTQgMTQgNDUuNTE2OHoiIG1hc2s9InVybCgjZCkiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxwYXRoIHN0cm9rZT0iI0E3QTdDQSIgc3Ryb2tlLXdpZHRoPSIxLjIiCiAgICAgICAgICAgIGQ9Ik0xMC4wODg2IDIxLjQ4NjV2LTMuNjk2Nkg2LjM5Mk0yMS4zODU1IDEwLjE4OTVoLTMuNjk2NlY2LjQ5M00yMS40MDIgMTcuNzk4M2gtMy42OTY2djMuNjk2Nk0xMC4yNTAzIDYuMTQ5OHYzLjg5ODVINi4zNTE3IiAvPgogICAgPC9nPgo8L3N2Zz4K)}.telebox-titlebar-icon-close{background:center/cover no-repeat url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyOCAyOCI+CiAgICA8ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iI0E3QTdDQSIgc3Ryb2tlLXdpZHRoPSIxLjQiPgogICAgICAgIDxwYXRoIGQ9Ik04LjM1MyAyMC4zMzIxTDIwLjMzMiA4LjM1M00yMC4zMzIyIDIwLjMzMjFMOC4zNTMgOC4zNTMiIC8+CiAgICA8L2c+Cjwvc3ZnPgo=)}.telebox-color-scheme-dark .telebox-titlebar{color:#e9e9e9;background:#43434d;border-bottom:none}.telebox-collector{visibility:hidden;display:block;position:absolute;z-index:200;width:40px;height:40px;margin:0;padding:0;border:none;outline:0;font-size:0;border-radius:50%;background:#fff;box-shadow:0 2px 6px #2f419226;cursor:pointer;user-select:none;pointer-events:none;background-repeat:no-repeat;background-size:18px 16px;background-position:center}.telebox-collector-visible{visibility:visible;pointer-events:initial}.telebox-collector-readonly{cursor:not-allowed}.telebox-color-scheme-dark.telebox-collector{background-color:#43434d}.telebox-max-titlebar{display:none;position:absolute;top:0;left:0;z-index:50000;user-select:none}.telebox-max-titlebar-maximized{display:flex}.telebox-titles{flex:1;height:100%;margin:0 16px 0 -16px;overflow-y:hidden;overflow-x:scroll;overflow-x:overlay;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;scrollbar-width:auto}.telebox-titles::-webkit-scrollbar{height:8px;width:8px}.telebox-titles::-webkit-scrollbar-track{background-color:transparent}.telebox-titles::-webkit-scrollbar-thumb{background-color:#eeeef7cc;background-color:transparent;border-radius:4px;transition:background-color .4s}.telebox-titles:hover::-webkit-scrollbar-thumb{background-color:#eeeef7cc}.telebox-titles::-webkit-scrollbar-thumb:hover{background-color:#eeeef7}.telebox-titles::-webkit-scrollbar-thumb:active{background-color:#eeeef7}.telebox-titles::-webkit-scrollbar-thumb:vertical{min-height:50px}.telebox-titles::-webkit-scrollbar-thumb:horizontal{min-width:50px}.telebox-titles-content{height:100%;display:flex;flex-wrap:nowrap;align-items:center;padding:0}.telebox-titles-tab{overflow:hidden;max-width:182px;min-width:50px;padding:0 26px 0 16px;outline:0;font-size:13px;font-family:PingFangSC-Regular,PingFang SC;font-weight:400;text-overflow:ellipsis;white-space:nowrap;word-break:keep-all;border:none;border-right:1px solid #e5e5f0;color:#7b88a0;background:0 0;cursor:pointer}.telebox-titles-tab~.telebox-titles-tab{margin-left:2px}.telebox-titles-tab-focus{color:#357bf6}.telebox-readonly .telebox-titles-tab{cursor:not-allowed}.telebox-color-scheme-dark{color-scheme:dark}.telebox-color-scheme-dark.telebox-titlebar{color:#e9e9e9;background:#43434d;border-bottom:none}.telebox-color-scheme-dark .telebox-titles-tab{border-right-color:#7b88a0}.telebox-color-scheme-dark .telebox-title{color:#e9e9e9}
package/docs/api.md CHANGED
@@ -4,6 +4,8 @@
4
4
  - [静态方法](#static-methods)
5
5
  - [`mount`](#mount)
6
6
  - [`register`](#register)
7
+ - [`setContainer`](#set-container)
8
+ - [`setCollectorContainer`](#set-collector-container)
7
9
  - [实例方法](#instance-methods)
8
10
  - [`addApp`](#addApp)
9
11
  - [`closeApp`](#closeApp)
@@ -63,6 +65,21 @@ WindowManager.register({
63
65
  })
64
66
  ```
65
67
 
68
+ <h3 id="set-container">setContainer</h3>
69
+
70
+ > 设置白板挂载容器
71
+
72
+ ```typescript
73
+ WindowManager.setContainer(document.getElementById("container"));
74
+ ```
75
+
76
+ <h3 id="set-container">setCollectorContainer</h3>
77
+
78
+ > 设置 `Collector` 挂载的容器
79
+
80
+ ```typescript
81
+ WindowManager.setCollectorContainer(document.getElementById("collector-container"));
82
+ ```
66
83
 
67
84
  <h2 id="instance-methods">实例方法</h2>
68
85
 
@@ -0,0 +1,42 @@
1
+
2
+ ### 注意事项
3
+
4
+ 多窗口模式必须开启白板的 `useMultiViews` 和 `useMobXState` 选项
5
+
6
+ 会造成原本以下 `room` 上的一些方法和 `state` 失效
7
+
8
+ `方法`
9
+
10
+ - `room.bindHtmlElement()` 用 `WindowManager.mount()` 代替
11
+ - `room.scalePptToFit()` 暂无代替,不再推荐调用 `scalePptToFit`
12
+ - `room.setScenePath()` 用 `manager.setMainViewScenePath()` 代替
13
+ - `room.setSceneIndex()` 用 `manager.setMainViewSceneIndex()` 代替
14
+
15
+ > 为了方便使用 `manager` 替换了 `room` 上的一些方法可以直接对 `mainView` 生效
16
+
17
+ - `room.disableCameraTransform`
18
+ - `room.moveCamera`
19
+ - `room.moveCameraToContain`
20
+ - `room.convertToPointInWorld`
21
+ - `room.setCameraBound`
22
+
23
+ `camera`
24
+
25
+ - `room.state.cameraState` 用 `manager.mainView.camera` 和 `manager.mainView.size` 代替
26
+
27
+ 想要监听主白板 `camera` 的变化, 请使用如下方式代替
28
+
29
+ ```javascript
30
+ manager.mainView.callbacks.on("onCameraUpdated", camera => {
31
+ console.log(camera);
32
+ });
33
+ ```
34
+
35
+ 监听主白板 `size` 变化
36
+
37
+ ```javascript
38
+ manager.mainView.callbacks.on("onSizeUpdated", size => {
39
+ console.log(size);
40
+ });
41
+ ```
42
+
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@netless/window-manager",
3
- "version": "0.3.17",
3
+ "version": "0.4.0-canary.2",
4
4
  "description": "",
5
5
  "main": "dist/index.es.js",
6
6
  "module": "dist/index.es.js",
@@ -24,10 +24,11 @@
24
24
  "@juggle/resize-observer": "^3.3.1",
25
25
  "@netless/app-docs-viewer": "0.1.26",
26
26
  "@netless/app-media-player": "0.1.0-beta.5",
27
- "@netless/telebox-insider": "^0.2.16",
27
+ "@netless/telebox-insider": "0.2.17",
28
28
  "emittery": "^0.9.2",
29
29
  "lodash": "^4.17.21",
30
30
  "p-retry": "^4.6.1",
31
+ "side-effect-manager": "^0.1.5",
31
32
  "uuid": "^7.0.3",
32
33
  "video.js": ">=7"
33
34
  },
package/src/AppContext.ts CHANGED
@@ -29,19 +29,19 @@ export class AppContext<TAttrs extends Record<string, any>, AppOptions = any> {
29
29
  listenDisposed,
30
30
  unlistenDisposed
31
31
  };
32
- private boxManager: BoxManager;
32
+
33
33
  private store = this.manager.store;
34
34
  public readonly isAddApp: boolean;
35
35
  public readonly isReplay = this.manager.isReplay;
36
36
 
37
37
  constructor(
38
38
  private manager: AppManager,
39
+ private boxManager: BoxManager,
39
40
  public appId: string,
40
41
  private appProxy: AppProxy,
41
42
  private appOptions?: AppOptions | (() => AppOptions),
42
43
  ) {
43
44
  this.emitter = appProxy.appEmitter;
44
- this.boxManager = this.manager.boxManager;
45
45
  this.isAddApp = appProxy.isAddApp;
46
46
  }
47
47
 
@@ -7,10 +7,13 @@ import { setViewFocusScenePath } from './Utils/Common';
7
7
 
8
8
  export class AppListeners {
9
9
  private displayer = this.manager.displayer;
10
- private boxManager = this.manager.boxManager;
11
10
 
12
11
  constructor(private manager: AppManager) {}
13
12
 
13
+ private get boxManager() {
14
+ return this.manager.boxManager;
15
+ }
16
+
14
17
  public addListeners() {
15
18
  this.displayer.addMagixEventListener(MagixEventName, this.mainMagixEventListener);
16
19
  }
@@ -43,6 +46,10 @@ export class AppListeners {
43
46
  this.setMainViewScenePathHandler(data.payload);
44
47
  break;
45
48
  }
49
+ case Events.MoveCameraToContain: {
50
+ this.moveCameraToContainHandler(data.payload);
51
+ break;
52
+ }
46
53
  default:
47
54
  break;
48
55
  }
@@ -50,11 +57,11 @@ export class AppListeners {
50
57
  };
51
58
 
52
59
  private appMoveHandler = (payload: any) => {
53
- this.boxManager.moveBox(payload);
60
+ this.boxManager?.moveBox(payload);
54
61
  };
55
62
 
56
63
  private appResizeHandler = (payload: any) => {
57
- this.boxManager.resizeBox(Object.assign(payload, { skipUpdate: true }));
64
+ this.boxManager?.resizeBox(Object.assign(payload, { skipUpdate: true }));
58
65
  this.manager.room?.refreshViewSize();
59
66
  };
60
67
 
@@ -69,4 +76,8 @@ export class AppListeners {
69
76
  private setMainViewScenePathHandler = ({ nextScenePath }: { nextScenePath: string }) => {
70
77
  setViewFocusScenePath(this.manager.mainView, nextScenePath);
71
78
  }
79
+
80
+ private moveCameraToContainHandler = (payload: any) => {
81
+ this.manager.mainView.moveCameraToContain(payload);
82
+ }
72
83
  }
package/src/AppManager.ts CHANGED
@@ -1,66 +1,57 @@
1
1
  import pRetry from "p-retry";
2
- import {
3
- AppAttributes,
4
- AppStatus,
5
- Events,
6
- MagixEventName
7
- } from "./constants";
2
+ import { AppAttributes, AppStatus, Events, MagixEventName } from "./constants";
8
3
  import { AppListeners } from "./AppListener";
9
4
  import { AppProxy } from "./AppProxy";
10
- import { AttributesDelegate } from "./AttributesDelegate";
11
- import {
12
- autorun,
13
- isPlayer,
14
- isRoom,
15
- ScenePathType,
16
- ViewVisionMode
17
- } from "white-web-sdk";
18
- import { BoxManager } from "./BoxManager";
19
- import { callbacks, emitter } from "./index";
5
+ import { autorun, isPlayer, isRoom, ScenePathType, ViewVisionMode } from "white-web-sdk";
6
+ import { callbacks, emitter, WindowManager } from "./index";
20
7
  import { CameraStore } from "./Utils/CameraStore";
21
8
  import { genAppId, makeValidScenePath, setScenePath } from "./Utils/Common";
22
9
  import { log } from "./Utils/log";
23
10
  import { MainViewProxy } from "./MainView";
24
11
  import { onObjectRemoved, safeListenPropsUpdated } from "./Utils/Reactive";
25
- import { ReconnectRefresher } from "./ReconnectRefresher";
12
+ import { reconnectRefresher } from "./ReconnectRefresher";
13
+ import { sortBy } from "lodash";
14
+ import { store } from "./AttributesDelegate";
26
15
  import { ViewManager } from "./ViewManager";
16
+ import type { ReconnectRefresher } from "./ReconnectRefresher";
17
+ import type { BoxManager } from "./BoxManager";
27
18
  import type { Displayer, DisplayerState, Room } from "white-web-sdk";
28
- import type { CreateTeleBoxManagerConfig } from "./BoxManager";
29
- import type {
30
- AddAppParams,
31
- BaseInsertParams,
32
- WindowManager,
33
- TeleBoxRect,
34
- EmitterEvent,
35
- } from "./index";
19
+ import type { AddAppParams, BaseInsertParams, TeleBoxRect, EmitterEvent } from "./index";
20
+
36
21
  export class AppManager {
37
22
  public displayer: Displayer;
38
- public boxManager: BoxManager;
39
23
  public cameraStore: CameraStore;
40
24
  public viewManager: ViewManager;
41
25
  public appProxies: Map<string, AppProxy> = new Map();
42
26
  public appStatus: Map<string, AppStatus> = new Map();
43
- public store = new AttributesDelegate(this);
27
+ public store = store;
44
28
  public mainViewProxy: MainViewProxy;
45
29
  public refresher?: ReconnectRefresher;
46
30
  public isReplay = this.windowManger.isReplay;
47
31
 
48
32
  private appListeners: AppListeners;
33
+ public boxManager?: BoxManager;
49
34
 
50
- constructor(public windowManger: WindowManager, options: CreateTeleBoxManagerConfig) {
35
+ constructor(public windowManger: WindowManager) {
51
36
  this.displayer = windowManger.displayer;
37
+ this.store.setContext({
38
+ getAttributes: () => this.attributes,
39
+ safeSetAttributes: attributes => this.safeSetAttributes(attributes),
40
+ safeUpdateAttributes: (keys, val) => this.safeUpdateAttributes(keys, val),
41
+ });
52
42
  this.cameraStore = new CameraStore();
53
43
  this.mainViewProxy = new MainViewProxy(this);
54
44
  this.viewManager = new ViewManager(this);
55
- this.boxManager = new BoxManager(this, options);
56
45
  this.appListeners = new AppListeners(this);
57
46
  this.displayer.callbacks.on(this.eventName, this.displayerStateListener);
58
47
  this.appListeners.addListeners();
59
48
 
60
- this.refresher = new ReconnectRefresher(this.room, this);
49
+ this.refresher = reconnectRefresher;
50
+ this.refresher.setRoom(this.room);
51
+ this.refresher.setContext({ emitter });
61
52
 
62
53
  emitter.once("onCreated").then(() => this.onCreated());
63
-
54
+ emitter.on("onReconnected", () => this.onReconnected());
64
55
  if (isPlayer(this.displayer)) {
65
56
  emitter.on("seek", time => {
66
57
  this.appProxies.forEach(appProxy => {
@@ -74,12 +65,15 @@ export class AppManager {
74
65
 
75
66
  private async onCreated() {
76
67
  await this.attributesUpdateCallback(this.attributes.apps);
77
- this.boxManager.updateManagerRect();
68
+ this.boxManager?.updateManagerRect();
78
69
  emitter.onAny(this.boxEventListener);
79
70
  this.refresher?.add("apps", () => {
80
- return safeListenPropsUpdated(() => this.attributes.apps, () => {
81
- this.attributesUpdateCallback(this.attributes.apps);
82
- });
71
+ return safeListenPropsUpdated(
72
+ () => this.attributes.apps,
73
+ () => {
74
+ this.attributesUpdateCallback(this.attributes.apps);
75
+ }
76
+ );
83
77
  });
84
78
  this.refresher?.add("appsClose", () => {
85
79
  return onObjectRemoved(this.attributes.apps, () => {
@@ -89,19 +83,19 @@ export class AppManager {
89
83
  this.refresher?.add("maximized", () => {
90
84
  return autorun(() => {
91
85
  const maximized = this.attributes.maximized;
92
- if (this.boxManager.maximized !== maximized) {
93
- this.boxManager.setMaximized(Boolean(maximized));
94
- }
86
+ this.boxManager?.setMaximized(Boolean(maximized));
95
87
  });
96
88
  });
97
89
  this.refresher?.add("minimized", () => {
98
90
  return autorun(() => {
99
91
  const minimized = this.attributes.minimized;
100
- if (this.boxManager.minimized !== minimized) {
92
+ if (this.boxManager?.minimized !== minimized) {
101
93
  if (minimized === true) {
102
- this.boxManager.blurAllBox();
94
+ this.boxManager?.blurAllBox();
103
95
  }
104
- this.boxManager.setMinimized(Boolean(minimized));
96
+ setTimeout(() => {
97
+ this.boxManager?.setMinimized(Boolean(minimized));
98
+ }, 0);
105
99
  }
106
100
  });
107
101
  });
@@ -124,29 +118,39 @@ export class AppManager {
124
118
  * @memberof WindowManager
125
119
  */
126
120
  public async attributesUpdateCallback(apps: any) {
127
- if (apps) {
128
- for (const id in apps) {
121
+ if (apps && WindowManager.container) {
122
+ const appIds = Object.keys(apps);
123
+ const appsWithCreatedAt = appIds.map(appId => {
124
+ return {
125
+ id: appId,
126
+ createdAt: apps[appId].createdAt,
127
+ };
128
+ });
129
+ for (const { id } of sortBy(appsWithCreatedAt, "createdAt")) {
129
130
  if (!this.appProxies.has(id) && !this.appStatus.has(id)) {
130
131
  const app = apps[id];
131
132
 
132
- pRetry(async () => {
133
- this.appStatus.set(id, AppStatus.StartCreate);
134
- // 防御 appAttributes 有可能为 undefined 的情况,这里做一个重试
135
- const appAttributes = this.attributes[id];
136
- if (!appAttributes) {
137
- throw new Error("appAttributes is undefined");
138
- }
139
- await this.baseInsertApp(
140
- {
141
- kind: app.kind,
142
- options: app.options,
143
- isDynamicPPT: app.isDynamicPPT,
144
- },
145
- id,
146
- false
147
- );
148
- this.focusByAttributes(apps);
149
- }, { retries: 3 }).catch(err => {
133
+ pRetry(
134
+ async () => {
135
+ this.appStatus.set(id, AppStatus.StartCreate);
136
+ // 防御 appAttributes 有可能为 undefined 的情况,这里做一个重试
137
+ const appAttributes = this.attributes[id];
138
+ if (!appAttributes) {
139
+ throw new Error("appAttributes is undefined");
140
+ }
141
+ await this.baseInsertApp(
142
+ {
143
+ kind: app.kind,
144
+ options: app.options,
145
+ isDynamicPPT: app.isDynamicPPT,
146
+ },
147
+ id,
148
+ false
149
+ );
150
+ this.focusByAttributes(apps);
151
+ },
152
+ { retries: 3 }
153
+ ).catch(err => {
150
154
  console.warn(`[WindowManager]: Insert App Error`, err);
151
155
  this.appStatus.delete(id);
152
156
  });
@@ -155,6 +159,22 @@ export class AppManager {
155
159
  }
156
160
  }
157
161
 
162
+ public refresh() {
163
+ this.attributesUpdateCallback(this.attributes.apps);
164
+ }
165
+
166
+ public setBoxManager(boxManager: BoxManager) {
167
+ this.boxManager = boxManager;
168
+ }
169
+
170
+ public resetMaximized() {
171
+ this.boxManager?.setMaximized(Boolean(this.store.getMaximized()));
172
+ }
173
+
174
+ public resetMinimized() {
175
+ this.boxManager?.setMinimized(Boolean(this.store.getMinimized()));
176
+ }
177
+
158
178
  private onAppDelete = (apps: any) => {
159
179
  const ids = Object.keys(apps);
160
180
  this.appProxies.forEach((appProxy, id) => {
@@ -169,7 +189,7 @@ export class AppManager {
169
189
  mainView.disableCameraTransform = disableCameraTransform;
170
190
  mainView.divElement = divElement;
171
191
  if (!mainView.focusScenePath) {
172
- this.store.setMainViewFocusPath();
192
+ this.store.setMainViewFocusPath(mainView);
173
193
  }
174
194
  if (this.store.focus === undefined && mainView.mode !== ViewVisionMode.Writable) {
175
195
  this.viewManager.switchMainViewToWriter();
@@ -192,7 +212,7 @@ export class AppManager {
192
212
  const attrs = params.attributes ?? {};
193
213
  this.safeUpdateAttributes([appId], attrs);
194
214
  this.store.setupAppAttributes(params, appId, isDynamicPPT);
195
- const needFocus = !this.boxManager.minimized;
215
+ const needFocus = !this.boxManager?.minimized;
196
216
  if (needFocus) {
197
217
  this.store.setAppFocus(appId, true);
198
218
  }
@@ -209,8 +229,8 @@ export class AppManager {
209
229
  });
210
230
  this.store.updateAppState(appProxy.id, AppAttributes.ZIndex, box.zIndex);
211
231
  }
212
- if (this.boxManager.minimized) {
213
- this.boxManager.setMinimized(false, false);
232
+ if (this.boxManager?.minimized) {
233
+ this.boxManager?.setMinimized(false, false);
214
234
  }
215
235
  }
216
236
 
@@ -268,9 +288,9 @@ export class AppManager {
268
288
  const isManualWritable =
269
289
  this.windowManger.readonly === undefined || this.windowManger.readonly === false;
270
290
  if (this.windowManger.readonly === undefined) {
271
- this.boxManager.setReadonly(isReadonly);
291
+ this.boxManager?.setReadonly(isReadonly);
272
292
  } else {
273
- this.boxManager.setReadonly(!(isWritable && isManualWritable));
293
+ this.boxManager?.setReadonly(!(isWritable && isManualWritable));
274
294
  }
275
295
  this.appProxies.forEach(appProxy => {
276
296
  appProxy.emitAppIsWritableChange();
@@ -337,7 +357,7 @@ export class AppManager {
337
357
  this.safeSetAttributes({ _mainScenePath: scenePath });
338
358
  await this.viewManager.switchMainViewToWriter();
339
359
  setScenePath(this.room, scenePath);
340
- this.store.setMainViewFocusPath();
360
+ this.store.setMainViewFocusPath(this.mainView);
341
361
  this.dispatchInternalEvent(Events.SetMainViewScenePath, { nextScenePath: scenePath });
342
362
  }
343
363
 
@@ -348,7 +368,7 @@ export class AppManager {
348
368
  this.room.setSceneIndex(index);
349
369
  const nextScenePath = this.room.state.sceneState.scenePath;
350
370
  this.store.setMainViewScenePath(nextScenePath);
351
- this.store.setMainViewFocusPath();
371
+ this.store.setMainViewFocusPath(this.mainView);
352
372
  this.dispatchInternalEvent(Events.SetMainViewScenePath, { nextScenePath });
353
373
  }
354
374
  }
@@ -407,7 +427,7 @@ export class AppManager {
407
427
  };
408
428
 
409
429
  public focusByAttributes(apps: any) {
410
- if (apps && Object.keys(apps).length === this.boxManager.appBoxMap.size) {
430
+ if (apps && Object.keys(apps).length === this.boxManager?.boxSize) {
411
431
  const focusAppId = this.store.focus;
412
432
  if (focusAppId) {
413
433
  this.boxManager.focusBox({ appId: focusAppId });
@@ -415,7 +435,7 @@ export class AppManager {
415
435
  }
416
436
  }
417
437
 
418
- public async notifyReconnected() {
438
+ public async onReconnected() {
419
439
  const appProxies = Array.from(this.appProxies.values());
420
440
  const reconnected = appProxies.map(appProxy => {
421
441
  return appProxy.onReconnected();
@@ -448,7 +468,7 @@ export class AppManager {
448
468
  });
449
469
  }
450
470
  this.viewManager.destroy();
451
- this.boxManager.destroy();
471
+ this.boxManager?.destroy();
452
472
  this.refresher?.destroy();
453
473
  this.mainViewProxy.destroy();
454
474
  callbacks.clearListeners();