@netless/fastboard-react 0.1.0 → 0.2.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.
Files changed (85) hide show
  1. package/dist/index.js +426 -487
  2. package/dist/index.js.map +1 -1
  3. package/dist/index.mjs +368 -425
  4. package/dist/index.mjs.map +1 -1
  5. package/package.json +18 -13
  6. package/src/components/Fastboard.tsx +27 -17
  7. package/src/components/PageControl/PageControl.tsx +2 -4
  8. package/src/components/PageControl/hooks.ts +18 -61
  9. package/src/components/Toolbar/Content.tsx +19 -4
  10. package/src/components/Toolbar/Toolbar.scss +13 -3
  11. package/src/components/Toolbar/Toolbar.tsx +15 -47
  12. package/src/components/hooks.ts +1 -1
  13. package/src/index.ts +1 -0
  14. package/src/vanilla/index.tsx +18 -0
  15. package/dist/behaviors/style.d.ts +0 -1
  16. package/dist/components/Fastboard.d.ts +0 -15
  17. package/dist/components/PageControl/PageControl.d.ts +0 -5
  18. package/dist/components/PageControl/hooks.d.ts +0 -9
  19. package/dist/components/PageControl/index.d.ts +0 -2
  20. package/dist/components/PlayerControl/PlayerControl.d.ts +0 -9
  21. package/dist/components/PlayerControl/hooks.d.ts +0 -11
  22. package/dist/components/PlayerControl/icons/Loading.d.ts +0 -3
  23. package/dist/components/PlayerControl/icons/Pause.d.ts +0 -3
  24. package/dist/components/PlayerControl/icons/Play.d.ts +0 -3
  25. package/dist/components/PlayerControl/icons/index.d.ts +0 -6
  26. package/dist/components/PlayerControl/index.d.ts +0 -2
  27. package/dist/components/RedoUndo/RedoUndo.d.ts +0 -5
  28. package/dist/components/RedoUndo/hooks.d.ts +0 -6
  29. package/dist/components/RedoUndo/index.d.ts +0 -2
  30. package/dist/components/Toolbar/Content.d.ts +0 -2
  31. package/dist/components/Toolbar/Toolbar.d.ts +0 -14
  32. package/dist/components/Toolbar/components/ApplianceButtons.d.ts +0 -7
  33. package/dist/components/Toolbar/components/AppsButton.d.ts +0 -6
  34. package/dist/components/Toolbar/components/ColorBox.d.ts +0 -2
  35. package/dist/components/Toolbar/components/CutLine.d.ts +0 -2
  36. package/dist/components/Toolbar/components/Mask.d.ts +0 -7
  37. package/dist/components/Toolbar/components/PencilButton.d.ts +0 -2
  38. package/dist/components/Toolbar/components/ShapesButton.d.ts +0 -3
  39. package/dist/components/Toolbar/components/Slider.d.ts +0 -2
  40. package/dist/components/Toolbar/components/TextButton.d.ts +0 -2
  41. package/dist/components/Toolbar/components/UpDownButtons.d.ts +0 -7
  42. package/dist/components/Toolbar/const.d.ts +0 -18
  43. package/dist/components/Toolbar/hooks.d.ts +0 -12
  44. package/dist/components/Toolbar/icons/Apps.d.ts +0 -3
  45. package/dist/components/Toolbar/icons/Arrow.d.ts +0 -3
  46. package/dist/components/Toolbar/icons/Circle.d.ts +0 -3
  47. package/dist/components/Toolbar/icons/Clean.d.ts +0 -3
  48. package/dist/components/Toolbar/icons/Clicker.d.ts +0 -3
  49. package/dist/components/Toolbar/icons/Collapse.d.ts +0 -3
  50. package/dist/components/Toolbar/icons/Diamond.d.ts +0 -3
  51. package/dist/components/Toolbar/icons/Down.d.ts +0 -3
  52. package/dist/components/Toolbar/icons/Eraser.d.ts +0 -3
  53. package/dist/components/Toolbar/icons/Expand.d.ts +0 -3
  54. package/dist/components/Toolbar/icons/Line.d.ts +0 -3
  55. package/dist/components/Toolbar/icons/Pencil.d.ts +0 -3
  56. package/dist/components/Toolbar/icons/Rectangle.d.ts +0 -3
  57. package/dist/components/Toolbar/icons/Selector.d.ts +0 -3
  58. package/dist/components/Toolbar/icons/SpeechBalloon.d.ts +0 -3
  59. package/dist/components/Toolbar/icons/Star.d.ts +0 -3
  60. package/dist/components/Toolbar/icons/Text.d.ts +0 -3
  61. package/dist/components/Toolbar/icons/Triangle.d.ts +0 -3
  62. package/dist/components/Toolbar/icons/Up.d.ts +0 -3
  63. package/dist/components/Toolbar/icons/index.d.ts +0 -22
  64. package/dist/components/Toolbar/index.d.ts +0 -2
  65. package/dist/components/ZoomControl/ZoomControl.d.ts +0 -5
  66. package/dist/components/ZoomControl/hooks.d.ts +0 -7
  67. package/dist/components/ZoomControl/index.d.ts +0 -2
  68. package/dist/components/hooks.d.ts +0 -13
  69. package/dist/i18n/index.d.ts +0 -12
  70. package/dist/icons/ChevronLeft.d.ts +0 -3
  71. package/dist/icons/ChevronRight.d.ts +0 -3
  72. package/dist/icons/FilePlus.d.ts +0 -3
  73. package/dist/icons/Minus.d.ts +0 -3
  74. package/dist/icons/Plus.d.ts +0 -3
  75. package/dist/icons/Redo.d.ts +0 -3
  76. package/dist/icons/Reset.d.ts +0 -3
  77. package/dist/icons/Undo.d.ts +0 -3
  78. package/dist/icons/index.d.ts +0 -7
  79. package/dist/index.d.ts +0 -9
  80. package/dist/internal/helpers.d.ts +0 -16
  81. package/dist/internal/hooks.d.ts +0 -3
  82. package/dist/internal/index.d.ts +0 -2
  83. package/dist/theme.d.ts +0 -16
  84. package/dist/typings.d.ts +0 -10
  85. package/src/components/Toolbar/components/Mask.tsx +0 -44
package/dist/index.js CHANGED
@@ -68,6 +68,7 @@ __export(src_exports, {
68
68
  ThemeContext: () => ThemeContext,
69
69
  Toolbar: () => Toolbar,
70
70
  ZoomControl: () => ZoomControl,
71
+ mount: () => mount,
71
72
  useBoxState: () => useBoxState,
72
73
  useFastboardApp: () => useFastboardApp,
73
74
  useFastboardValue: () => useFastboardValue,
@@ -84,10 +85,6 @@ __export(src_exports, {
84
85
  useZoomControl: () => useZoomControl
85
86
  });
86
87
 
87
- // ../../node_modules/.pnpm/tsup@5.11.11_typescript@4.5.4/node_modules/tsup/assets/cjs_shims.js
88
- var getImportMetaUrl = () => typeof document === "undefined" ? new URL("file:" + __filename).href : document.currentScript && document.currentScript.src || new URL("main.js", document.baseURI).href;
89
- var importMetaUrl = getImportMetaUrl();
90
-
91
88
  // src/internal/helpers.ts
92
89
  function noop() {
93
90
  return;
@@ -139,7 +136,7 @@ function useForceUpdate() {
139
136
  }
140
137
 
141
138
  // src/style.scss?inline
142
- var style_default = '.page-renderer-pages-container{position:relative;overflow:hidden}.page-renderer-page{position:absolute;top:0;left:0;will-change:transform;background-position:center;background-size:cover;background-repeat:no-repeat}.page-renderer-page-img{display:block;width:100%;height:auto;user-select:none}.netless-app-docs-viewer-static-scrollbar{position:absolute;top:0;right:0;z-index:2147483647;width:8px;min-height:30px;margin:0;padding:0;border:none;outline:none;border-radius:4px;background:rgba(68,78,96,.4);box-shadow:1px 1px 8px #ffffffb3;opacity:0;transition:background .4s,opacity .4s 3s,transform .2s;will-change:transform,height;user-select:none}.netless-app-docs-viewer-static-scrollbar.netless-app-docs-viewer-static-scrollbar-dragging{background:rgba(68,78,96,.6);opacity:1;transition:background .4s,opacity .4s 3s!important}.netless-app-docs-viewer-static-scrollbar:hover,.netless-app-docs-viewer-static-scrollbar:focus{background:rgba(68,78,96,.5)}.netless-app-docs-viewer-static-scrollbar:active{background:rgba(68,78,96,.6)}.netless-app-docs-viewer-content:hover .netless-app-docs-viewer-static-scrollbar{opacity:1;transition:background .4s,opacity .4s,transform .2s}.netless-app-docs-viewer-readonly .netless-app-docs-viewer-static-scrollbar{display:none}.netless-app-docs-viewer-static-pages:hover .netless-app-docs-viewer-static-scrollbar{opacity:1;transition:background .4s,opacity .4s,transform .2s}.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,.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}.telebox-collector{position:absolute;right:10px;bottom:15px}.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;touch-action:manipulation}.telebox-title-area{overflow:hidden;position:relative;height:100%;flex:1;display:flex;align-items:center}.telebox-title{overflow:hidden;margin: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-drag-area{position:absolute;inset:0;margin:auto;z-index:10}.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 .telebox-drag-area{height:100%;min-width:16px;position:static;margin:0;flex-grow:1;flex-shrink:0}.telebox-max-titlebar-maximized{display:flex}.telebox-titles{height:100%;margin:0;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{height:100%;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;user-select:none}.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}.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1}.tippy-box[data-theme~=light]{color:#26323d;box-shadow:0 0 20px 4px #9aa1b126,0 4px 80px -8px #24282f40,0 4px 4px -2px #5b5e6926;background-color:#fff}.tippy-box[data-theme~=light][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=light][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff}.tippy-box[data-theme~=light][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=light][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff}.tippy-box[data-theme~=light]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=light]>.tippy-svg-arrow{fill:#fff}.rc-slider{position:relative;height:14px;padding:5px 0;width:100%;border-radius:6px;touch-action:none;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0)}.rc-slider *{box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0)}.rc-slider-rail{position:absolute;width:100%;background-color:#e9e9e9;height:4px;border-radius:6px}.rc-slider-track{position:absolute;left:0;height:4px;border-radius:6px;background-color:#abe2fb}.rc-slider-handle{position:absolute;width:14px;height:14px;cursor:pointer;cursor:-webkit-grab;margin-top:-5px;cursor:grab;border-radius:50%;border:solid 2px #96dbfa;background-color:#fff;touch-action:pan-x}.rc-slider-handle-dragging.rc-slider-handle-dragging.rc-slider-handle-dragging{border-color:#57c5f7;box-shadow:0 0 0 5px #96dbfa}.rc-slider-handle:focus{outline:none}.rc-slider-handle-click-focused:focus{border-color:#96dbfa;box-shadow:unset}.rc-slider-handle:hover{border-color:#57c5f7}.rc-slider-handle:active{border-color:#57c5f7;box-shadow:0 0 5px #57c5f7;cursor:-webkit-grabbing;cursor:grabbing}.rc-slider-mark{position:absolute;top:18px;left:0;width:100%;font-size:12px}.rc-slider-mark-text{position:absolute;display:inline-block;vertical-align:middle;text-align:center;cursor:pointer;color:#999}.rc-slider-mark-text-active{color:#666}.rc-slider-step{position:absolute;width:100%;height:4px;background:transparent}.rc-slider-dot{position:absolute;bottom:-2px;margin-left:-4px;width:8px;height:8px;border:2px solid #e9e9e9;background-color:#fff;cursor:pointer;border-radius:50%;vertical-align:middle}.rc-slider-dot-active{border-color:#96dbfa}.rc-slider-dot-reverse{margin-right:-4px}.rc-slider-disabled{background-color:#e9e9e9}.rc-slider-disabled .rc-slider-track{background-color:#ccc}.rc-slider-disabled .rc-slider-handle,.rc-slider-disabled .rc-slider-dot{border-color:#ccc;box-shadow:none;background-color:#fff;cursor:not-allowed}.rc-slider-disabled .rc-slider-mark-text,.rc-slider-disabled .rc-slider-dot{cursor:not-allowed!important}.rc-slider-vertical{width:14px;height:100%;padding:0 5px}.rc-slider-vertical .rc-slider-rail{height:100%;width:4px}.rc-slider-vertical .rc-slider-track{left:5px;bottom:0;width:4px}.rc-slider-vertical .rc-slider-handle{margin-left:-5px;touch-action:pan-y}.rc-slider-vertical .rc-slider-mark{top:0;left:18px;height:100%}.rc-slider-vertical .rc-slider-step{height:100%;width:4px}.rc-slider-vertical .rc-slider-dot{left:2px;margin-bottom:-4px}.rc-slider-vertical .rc-slider-dot:first-child{margin-bottom:-4px}.rc-slider-vertical .rc-slider-dot:last-child{margin-bottom:-4px}.rc-slider-tooltip-zoom-down-enter,.rc-slider-tooltip-zoom-down-appear,.rc-slider-tooltip-zoom-down-leave{animation-duration:.3s;animation-fill-mode:both;display:block!important;animation-play-state:paused}.rc-slider-tooltip-zoom-down-enter.rc-slider-tooltip-zoom-down-enter-active,.rc-slider-tooltip-zoom-down-appear.rc-slider-tooltip-zoom-down-appear-active{animation-name:rcSliderTooltipZoomDownIn;animation-play-state:running}.rc-slider-tooltip-zoom-down-leave.rc-slider-tooltip-zoom-down-leave-active{animation-name:rcSliderTooltipZoomDownOut;animation-play-state:running}.rc-slider-tooltip-zoom-down-enter,.rc-slider-tooltip-zoom-down-appear{transform:scale(0);animation-timing-function:cubic-bezier(.23,1,.32,1)}.rc-slider-tooltip-zoom-down-leave{animation-timing-function:cubic-bezier(.755,.05,.855,.06)}@keyframes rcSliderTooltipZoomDownIn{0%{opacity:0;transform-origin:50% 100%;transform:scale(0)}to{transform-origin:50% 100%;transform:scale(1)}}@keyframes rcSliderTooltipZoomDownOut{0%{transform-origin:50% 100%;transform:scale(1)}to{opacity:0;transform-origin:50% 100%;transform:scale(0)}}.rc-slider-tooltip{position:absolute;left:-9999px;top:-9999px;visibility:visible;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0)}.rc-slider-tooltip *{box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0)}.rc-slider-tooltip-hidden{display:none}.rc-slider-tooltip-placement-top{padding:4px 0 8px}.rc-slider-tooltip-inner{padding:6px 2px;min-width:24px;height:24px;font-size:12px;line-height:1;color:#fff;text-align:center;text-decoration:none;background-color:#6c6c6c;border-radius:6px;box-shadow:0 0 4px #d9d9d9}.rc-slider-tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.rc-slider-tooltip-placement-top .rc-slider-tooltip-arrow{bottom:4px;left:50%;margin-left:-4px;border-width:4px 4px 0;border-top-color:#6c6c6c}.fastboard-root{position:relative;width:100%;height:100%;overflow:hidden}.fastboard-view{position:absolute;top:0;left:0;width:100%;height:100%}.fastboard-left{position:absolute;top:0;left:0;height:calc(100% - 48px);padding:16px;z-index:201;display:flex;align-items:center}.fastboard-bottom-left,.fastboard-bottom-right{display:flex;gap:10px;position:absolute;bottom:8px;left:8px;padding:8px;z-index:200}.fastboard-bottom-right{left:initial;right:8px}.fastboard-redo-undo{display:inline-flex;align-items:center;gap:4px;padding:4px;border-radius:4px;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px)}.fastboard-redo-undo.light{color:#333;background-color:#ffffffd9;border:1px solid rgba(0,0,0,.15)}.fastboard-redo-undo.dark{color:#ddd;background-color:#333333d9;border:1px solid rgba(0,0,0,.45)}.fastboard-redo-undo-btn{appearance:none;cursor:pointer;margin:0;border:0;padding:0;width:24px;height:24px;background-color:transparent;border-radius:4px;font-size:24px;line-height:1}.fastboard-redo-undo-btn svg,.fastboard-redo-undo-btn img{width:1em;height:1em}.fastboard-redo-undo-btn:disabled{opacity:.5;cursor:not-allowed}.fastboard-redo-undo-btn.light:not(:disabled):hover{background-color:#3381ff1a}.fastboard-redo-undo-btn.dark:not(:disabled):hover{background-color:#3381ff40}.fastboard-page-control{display:inline-flex;align-items:center;gap:4px;padding:4px;border-radius:4px;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px)}.fastboard-page-control.light{color:#333;background-color:#ffffffd9;border:1px solid rgba(0,0,0,.15)}.fastboard-page-control.dark{color:#ddd;background-color:#333333d9;border:1px solid rgba(0,0,0,.45)}.fastboard-page-control-btn{appearance:none;cursor:pointer;margin:0;border:0;padding:0;width:24px;height:24px;background-color:transparent;border-radius:4px;font-size:24px;line-height:1}.fastboard-page-control-btn svg,.fastboard-page-control-btn img{width:1em;height:1em}.fastboard-page-control-btn:disabled{opacity:.5;cursor:not-allowed}.fastboard-page-control-btn.light:not(:disabled):hover{background-color:#3381ff1a}.fastboard-page-control-btn.dark:not(:disabled):hover{background-color:#3381ff40}.fastboard-page-control-cut-line{height:24px;width:.5px}.fastboard-page-control-cut-line.light{background-color:#e7e7e7}.fastboard-page-control-cut-line.dark{background-color:#ffffff26}.fastboard-page-control-slash{opacity:.6}.fastboard-page-control-page,.fastboard-page-control-slash,.fastboard-page-control-page-count{font-size:12px;font-variant-numeric:tabular-nums}.fastboard-zoom-control{position:relative;display:inline-flex;align-items:center;gap:4px;padding:4px;border-radius:4px;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px)}.fastboard-zoom-control.light{color:#333;background-color:#ffffffd9;border:1px solid rgba(0,0,0,.15)}.fastboard-zoom-control.dark{color:#ddd;background-color:#333333d9;border:1px solid rgba(0,0,0,.45)}.fastboard-zoom-control-btn{appearance:none;cursor:pointer;margin:0;border:0;padding:0;width:24px;height:24px;background-color:transparent;border-radius:4px;font-size:24px;line-height:1}.fastboard-zoom-control-btn svg,.fastboard-zoom-control-btn img{width:1em;height:1em}.fastboard-zoom-control-btn:disabled{opacity:.5;cursor:not-allowed}.fastboard-zoom-control-btn.light:not(:disabled):hover{background-color:#3381ff1a}.fastboard-zoom-control-btn.dark:not(:disabled):hover{background-color:#3381ff40}.fastboard-zoom-control-cut-line{height:24px;width:.5px}.fastboard-zoom-control-cut-line.light{background-color:#e7e7e7}.fastboard-zoom-control-cut-line.dark{background-color:#ffffff26}.fastboard-zoom-control-percent{opacity:.6}.fastboard-zoom-control-scale,.fastboard-zoom-control-percent{font-size:12px;font-variant-numeric:tabular-nums}.fastboard-toolbar{display:flex;align-items:center;padding:4px;border-radius:4px;flex-direction:column;gap:4px;position:absolute;z-index:100;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px)}.fastboard-toolbar .rc-slider{padding:6px 0}.fastboard-toolbar .rc-slider-rail,.fastboard-toolbar .rc-slider-track{height:2px}.fastboard-toolbar .tippy-content{padding:8px}.fastboard-toolbar .tippy-box{border:1px solid rgba(0,0,0,.15);background-color:#333333f2;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px)}.fastboard-toolbar .tippy-box[data-theme~=light]{background-color:#fffffff2;box-shadow:0 5px 10px #00000040}.fastboard-toolbar.light{color:#333;background-color:#ffffffd9;border:1px solid rgba(0,0,0,.15)}.fastboard-toolbar.expanded{border:1px solid rgba(0,0,0,.15)}.fastboard-toolbar.dark{color:#ddd;background-color:#333333d9}.fastboard-toolbar.expanded:hover{box-shadow:0 0 5px #00000040;transform:translate(0)}.fastboard-toolbar.collapsed{padding:0;background-color:transparent}.fastboard-toolbar-tooltip{display:inline-flex;align-items:center;gap:4px}.fastboard-toolbar-hotkey{margin-right:-4px;width:24px;height:24px;border-radius:4px;background-color:#ffffff1a;display:inline-flex;align-items:center;justify-content:center}.fastboard-toolbar-btn{appearance:none;cursor:pointer;margin:0;border:0;padding:4px;width:32px;height:32px;background-color:transparent;border-radius:4px;font-size:24px;line-height:1;position:relative}.fastboard-toolbar-btn-interactive{display:inline-block;width:32px;height:32px}.fastboard-toolbar-btn svg,.fastboard-toolbar-btn img{width:1em;height:1em}.fastboard-toolbar-btn:disabled{opacity:.5;cursor:not-allowed}.fastboard-toolbar-btn.light:not(:disabled):hover{background-color:#3381ff1a}.fastboard-toolbar-btn.dark:not(:disabled):hover{background-color:#3381ff40}.fastboard-toolbar-triangle{width:0px;height:0px;border-bottom:4px solid;border-left:4px solid transparent;position:absolute;bottom:0;right:0}.fastboard-toolbar-cut-line{display:inline-block;height:.5px;width:100%}.fastboard-toolbar-cut-line.light{background-color:#e7e7e7}.fastboard-toolbar-cut-line.dark{background-color:#ffffff26}.fastboard-toolbar-section{display:inline-flex;flex-flow:column nowrap;gap:4px;scroll-behavior:smooth}.fastboard-toolbar-section.collapsed{transform:translate(-100%);transition:1s transform}.fastboard-toolbar-panel{width:120px;padding:0;display:flex;flex-flow:column nowrap;align-items:center;gap:8px}.fastboard-toolbar-panel.apps{width:224px}.fastboard-toolbar-color-box,.fastboard-toolbar-shapes{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;align-items:center;justify-items:center}.fastboard-toolbar-color-box .fastboard-toolbar-btn,.fastboard-toolbar-shapes .fastboard-toolbar-btn{padding:0;width:24px;height:24px}.fastboard-toolbar-apps{width:100%;display:grid;grid-template-columns:repeat(3,1fr);gap:8px;align-items:center;justify-items:center}.fastboard-toolbar-apps .fastboard-toolbar-btn{width:40px;height:40px;font-size:40px}.fastboard-toolbar-app-icon{padding-top:4px;display:inline-flex;flex-flow:column nowrap;align-items:center;gap:4px}.fastboard-toolbar-app-icon .fastboard-toolbar-btn{padding:0}.fastboard-toolbar-app-icon-text{font-size:12px;color:#5d5d5d;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.fastboard-toolbar-color-item{width:24px;height:24px;border-radius:4px;cursor:pointer}.fastboard-toolbar-color-item *.light:hover{background-color:#f5f5f5}.fastboard-toolbar-color-item *.dark:hover{background-color:#333}.fastboard-toolbar-color-border{width:24px;height:24px;border:1px solid transparent;border-radius:4px;display:inline-flex;align-items:center;justify-content:center}.fastboard-toolbar-color-border.active.light,.fastboard-toolbar-color-border.active.dark{border:1px solid rgba(51,129,255,.8)}.fastboard-toolbar-color-btn{margin:0;border:1px solid rgba(0,0,0,.24);padding:0;appearance:none;width:16px;height:16px;border-radius:4px;cursor:pointer}.fastboard-toolbar-color-btn:focus-visible{outline-offset:2px}.fastboard-toolbar-mask-btn{width:17px;height:62px;cursor:pointer}.fastboard-toolbar-mask-btn.dark{filter:invert(.8)}.fastboard-toolbar-expand-btn{display:flex;align-items:center;position:absolute;left:0}.fastboard-player-control{width:100%;display:inline-flex;align-items:center;gap:4px;padding:4px;border-radius:4px;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px)}.fastboard-player-control.auto-hide{opacity:0;transition:opacity .2s}.fastboard-player-control.auto-hide:hover{opacity:1}.fastboard-player-control .rc-slider-disabled{background:transparent;opacity:.5}.fastboard-player-control .rc-slider-rail,.fastboard-player-control .rc-slider-track{height:2px}.fastboard-player-control .tippy-content{padding:8px}.fastboard-player-control .tippy-box{border:1px solid rgba(0,0,0,.15);background-color:#333333f2;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px)}.fastboard-player-control .tippy-box[data-theme~=light]{background-color:#fffffff2;box-shadow:0 5px 10px #00000040}.fastboard-player-control.light{color:#333;background-color:#ffffffd9;border:1px solid rgba(0,0,0,.15)}.fastboard-player-control.dark{color:#ddd;background-color:#333333d9;border:1px solid rgba(0,0,0,.45)}.fastboard-player-control-btn{appearance:none;cursor:pointer;margin:0;border:0;padding:0;min-width:24px;height:24px;background-color:transparent;border-radius:4px;font-size:24px;line-height:1;display:inline-flex;align-items:center;justify-content:center}.fastboard-player-control-btn svg,.fastboard-player-control-btn img{width:1em;height:1em}.fastboard-player-control-btn:disabled{opacity:.5;cursor:not-allowed}.fastboard-player-control-btn.light:not(:disabled):hover{background-color:#3381ff1a}.fastboard-player-control-btn.dark:not(:disabled):hover{background-color:#3381ff40}.fastboard-player-control-btn.loading{animation:fastboard-player-control-rotate .5s linear infinite}@keyframes fastboard-player-control-rotate{to{transform:rotate(360deg)}}.fastboard-player-control-panel{padding:0;display:flex;flex-flow:column nowrap;align-items:stretch;gap:4px}.fastboard-player-control-panel .fastboard-player-control-btn{width:initial;height:initial;user-select:none;font-size:12px;padding:4px;justify-content:flex-end}.fastboard-player-control-panel .fastboard-player-control-btn.active{color:#3381ff}.fastboard-player-control-slider{width:100%;padding:0 7px}.fastboard-player-control-slider.loading{cursor:not-allowed}.fastboard-player-control-slash{opacity:.6}.fastboard-player-control-current,.fastboard-player-control-slash,.fastboard-player-control-total,.fastboard-player-control-speed-text{font-size:12px;font-variant-numeric:tabular-nums}.tippy-box.fastboard-tip{color:#eee;background-color:#000000f2;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px)}.tippy-box.fastboard-tip[data-placement^=right]>.tippy-arrow:before{top:4px;border-width:4px;border-right-color:#000}.tippy-box.fastboard-tip[data-placement^=top]>.tippy-arrow:before{left:4px;border-width:4px;border-top-color:#000}\n';
139
+ var style_default = '.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,.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 .1s;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}.telebox-collector{position:absolute;right:10px;bottom:15px}.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;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{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;touch-action:manipulation}.telebox-title-area{overflow:hidden;position:relative;height:100%;flex:1;display:flex;align-items:center}.telebox-title{overflow:hidden;margin: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-drag-area{position:absolute;inset:0;margin:auto;z-index:10}.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 .telebox-drag-area{height:100%;min-width:16px;position:static;margin:0;flex-grow:1;flex-shrink:0}.telebox-max-titlebar-maximized{display:flex}.telebox-titles{height:100%;margin:0;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{height:100%;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;user-select:none}.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}.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1}.tippy-box[data-theme~=light]{color:#26323d;box-shadow:0 0 20px 4px #9aa1b126,0 4px 80px -8px #24282f40,0 4px 4px -2px #5b5e6926;background-color:#fff}.tippy-box[data-theme~=light][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=light][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff}.tippy-box[data-theme~=light][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=light][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff}.tippy-box[data-theme~=light]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=light]>.tippy-svg-arrow{fill:#fff}.rc-slider{position:relative;height:14px;padding:5px 0;width:100%;border-radius:6px;touch-action:none;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0)}.rc-slider *{box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0)}.rc-slider-rail{position:absolute;width:100%;background-color:#e9e9e9;height:4px;border-radius:6px}.rc-slider-track{position:absolute;left:0;height:4px;border-radius:6px;background-color:#abe2fb}.rc-slider-handle{position:absolute;width:14px;height:14px;cursor:pointer;cursor:-webkit-grab;margin-top:-5px;cursor:grab;border-radius:50%;border:solid 2px #96dbfa;background-color:#fff;touch-action:pan-x}.rc-slider-handle-dragging.rc-slider-handle-dragging.rc-slider-handle-dragging{border-color:#57c5f7;box-shadow:0 0 0 5px #96dbfa}.rc-slider-handle:focus{outline:none}.rc-slider-handle-click-focused:focus{border-color:#96dbfa;box-shadow:unset}.rc-slider-handle:hover{border-color:#57c5f7}.rc-slider-handle:active{border-color:#57c5f7;box-shadow:0 0 5px #57c5f7;cursor:-webkit-grabbing;cursor:grabbing}.rc-slider-mark{position:absolute;top:18px;left:0;width:100%;font-size:12px}.rc-slider-mark-text{position:absolute;display:inline-block;vertical-align:middle;text-align:center;cursor:pointer;color:#999}.rc-slider-mark-text-active{color:#666}.rc-slider-step{position:absolute;width:100%;height:4px;background:transparent}.rc-slider-dot{position:absolute;bottom:-2px;margin-left:-4px;width:8px;height:8px;border:2px solid #e9e9e9;background-color:#fff;cursor:pointer;border-radius:50%;vertical-align:middle}.rc-slider-dot-active{border-color:#96dbfa}.rc-slider-dot-reverse{margin-right:-4px}.rc-slider-disabled{background-color:#e9e9e9}.rc-slider-disabled .rc-slider-track{background-color:#ccc}.rc-slider-disabled .rc-slider-handle,.rc-slider-disabled .rc-slider-dot{border-color:#ccc;box-shadow:none;background-color:#fff;cursor:not-allowed}.rc-slider-disabled .rc-slider-mark-text,.rc-slider-disabled .rc-slider-dot{cursor:not-allowed!important}.rc-slider-vertical{width:14px;height:100%;padding:0 5px}.rc-slider-vertical .rc-slider-rail{height:100%;width:4px}.rc-slider-vertical .rc-slider-track{left:5px;bottom:0;width:4px}.rc-slider-vertical .rc-slider-handle{margin-left:-5px;touch-action:pan-y}.rc-slider-vertical .rc-slider-mark{top:0;left:18px;height:100%}.rc-slider-vertical .rc-slider-step{height:100%;width:4px}.rc-slider-vertical .rc-slider-dot{left:2px;margin-bottom:-4px}.rc-slider-vertical .rc-slider-dot:first-child{margin-bottom:-4px}.rc-slider-vertical .rc-slider-dot:last-child{margin-bottom:-4px}.rc-slider-tooltip-zoom-down-enter,.rc-slider-tooltip-zoom-down-appear,.rc-slider-tooltip-zoom-down-leave{animation-duration:.3s;animation-fill-mode:both;display:block!important;animation-play-state:paused}.rc-slider-tooltip-zoom-down-enter.rc-slider-tooltip-zoom-down-enter-active,.rc-slider-tooltip-zoom-down-appear.rc-slider-tooltip-zoom-down-appear-active{animation-name:rcSliderTooltipZoomDownIn;animation-play-state:running}.rc-slider-tooltip-zoom-down-leave.rc-slider-tooltip-zoom-down-leave-active{animation-name:rcSliderTooltipZoomDownOut;animation-play-state:running}.rc-slider-tooltip-zoom-down-enter,.rc-slider-tooltip-zoom-down-appear{transform:scale(0);animation-timing-function:cubic-bezier(.23,1,.32,1)}.rc-slider-tooltip-zoom-down-leave{animation-timing-function:cubic-bezier(.755,.05,.855,.06)}@keyframes rcSliderTooltipZoomDownIn{0%{opacity:0;transform-origin:50% 100%;transform:scale(0)}to{transform-origin:50% 100%;transform:scale(1)}}@keyframes rcSliderTooltipZoomDownOut{0%{transform-origin:50% 100%;transform:scale(1)}to{opacity:0;transform-origin:50% 100%;transform:scale(0)}}.rc-slider-tooltip{position:absolute;left:-9999px;top:-9999px;visibility:visible;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0)}.rc-slider-tooltip *{box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0)}.rc-slider-tooltip-hidden{display:none}.rc-slider-tooltip-placement-top{padding:4px 0 8px}.rc-slider-tooltip-inner{padding:6px 2px;min-width:24px;height:24px;font-size:12px;line-height:1;color:#fff;text-align:center;text-decoration:none;background-color:#6c6c6c;border-radius:6px;box-shadow:0 0 4px #d9d9d9}.rc-slider-tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.rc-slider-tooltip-placement-top .rc-slider-tooltip-arrow{bottom:4px;left:50%;margin-left:-4px;border-width:4px 4px 0;border-top-color:#6c6c6c}.fastboard-root{position:relative;width:100%;height:100%;overflow:hidden}.fastboard-view{position:absolute;top:0;left:0;width:100%;height:100%}.fastboard-left{position:absolute;top:0;left:0;height:calc(100% - 48px);padding:16px;z-index:201;display:flex;align-items:center}.fastboard-bottom-left,.fastboard-bottom-right{display:flex;gap:10px;position:absolute;bottom:8px;left:8px;padding:8px;z-index:200}.fastboard-bottom-right{left:initial;right:8px}.fastboard-redo-undo{display:inline-flex;align-items:center;gap:4px;padding:4px;border-radius:4px;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px)}.fastboard-redo-undo.light{color:#333;background-color:#ffffffd9;border:1px solid rgba(0,0,0,.15)}.fastboard-redo-undo.dark{color:#ddd;background-color:#333333d9;border:1px solid rgba(0,0,0,.45)}.fastboard-redo-undo-btn{appearance:none;cursor:pointer;margin:0;border:0;padding:0;width:24px;height:24px;background-color:transparent;border-radius:4px;font-size:24px;line-height:1}.fastboard-redo-undo-btn svg,.fastboard-redo-undo-btn img{width:1em;height:1em}.fastboard-redo-undo-btn:disabled{opacity:.5;cursor:not-allowed}.fastboard-redo-undo-btn.light:not(:disabled):hover{background-color:#3381ff1a}.fastboard-redo-undo-btn.dark:not(:disabled):hover{background-color:#3381ff40}.fastboard-page-control{display:inline-flex;align-items:center;gap:4px;padding:4px;border-radius:4px;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px)}.fastboard-page-control.light{color:#333;background-color:#ffffffd9;border:1px solid rgba(0,0,0,.15)}.fastboard-page-control.dark{color:#ddd;background-color:#333333d9;border:1px solid rgba(0,0,0,.45)}.fastboard-page-control-btn{appearance:none;cursor:pointer;margin:0;border:0;padding:0;width:24px;height:24px;background-color:transparent;border-radius:4px;font-size:24px;line-height:1}.fastboard-page-control-btn svg,.fastboard-page-control-btn img{width:1em;height:1em}.fastboard-page-control-btn:disabled{opacity:.5;cursor:not-allowed}.fastboard-page-control-btn.light:not(:disabled):hover{background-color:#3381ff1a}.fastboard-page-control-btn.dark:not(:disabled):hover{background-color:#3381ff40}.fastboard-page-control-cut-line{height:24px;width:.5px}.fastboard-page-control-cut-line.light{background-color:#e7e7e7}.fastboard-page-control-cut-line.dark{background-color:#ffffff26}.fastboard-page-control-slash{opacity:.6}.fastboard-page-control-page,.fastboard-page-control-slash,.fastboard-page-control-page-count{font-size:12px;font-variant-numeric:tabular-nums}.fastboard-zoom-control{position:relative;display:inline-flex;align-items:center;gap:4px;padding:4px;border-radius:4px;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px)}.fastboard-zoom-control.light{color:#333;background-color:#ffffffd9;border:1px solid rgba(0,0,0,.15)}.fastboard-zoom-control.dark{color:#ddd;background-color:#333333d9;border:1px solid rgba(0,0,0,.45)}.fastboard-zoom-control-btn{appearance:none;cursor:pointer;margin:0;border:0;padding:0;width:24px;height:24px;background-color:transparent;border-radius:4px;font-size:24px;line-height:1}.fastboard-zoom-control-btn svg,.fastboard-zoom-control-btn img{width:1em;height:1em}.fastboard-zoom-control-btn:disabled{opacity:.5;cursor:not-allowed}.fastboard-zoom-control-btn.light:not(:disabled):hover{background-color:#3381ff1a}.fastboard-zoom-control-btn.dark:not(:disabled):hover{background-color:#3381ff40}.fastboard-zoom-control-cut-line{height:24px;width:.5px}.fastboard-zoom-control-cut-line.light{background-color:#e7e7e7}.fastboard-zoom-control-cut-line.dark{background-color:#ffffff26}.fastboard-zoom-control-percent{opacity:.6}.fastboard-zoom-control-scale,.fastboard-zoom-control-percent{font-size:12px;font-variant-numeric:tabular-nums}.fastboard-toolbar{display:flex;align-items:center;padding:4px;border-radius:4px;flex-direction:column;gap:4px;position:absolute;z-index:100;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px)}.fastboard-toolbar .rc-slider{padding:6px 0}.fastboard-toolbar .rc-slider-rail,.fastboard-toolbar .rc-slider-track{height:2px}.fastboard-toolbar .tippy-content{padding:8px}.fastboard-toolbar .tippy-box{border:1px solid rgba(0,0,0,.15);background-color:#333333f2;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px)}.fastboard-toolbar .tippy-box[data-theme~=light]{background-color:#fffffff2;box-shadow:0 5px 10px #00000040}.fastboard-toolbar.light{color:#333;background-color:#ffffffd9;border:1px solid rgba(0,0,0,.15)}.fastboard-toolbar.expanded{border:1px solid rgba(0,0,0,.15)}.fastboard-toolbar.dark{color:#ddd;background-color:#333333d9}.fastboard-toolbar.expanded:hover{box-shadow:0 0 5px #00000040;transform:translate(0)}.fastboard-toolbar.collapsed{padding:0;background-color:transparent}.fastboard-toolbar-tooltip{display:inline-flex;align-items:center;gap:4px}.fastboard-toolbar-hotkey{margin-right:-4px;width:24px;height:24px;border-radius:4px;background-color:#ffffff1a;display:inline-flex;align-items:center;justify-content:center}.fastboard-toolbar-btn{appearance:none;cursor:pointer;margin:0;border:0;padding:4px;width:32px;height:32px;background-color:transparent;border-radius:4px;font-size:24px;line-height:1;position:relative}.fastboard-toolbar-btn-interactive{display:inline-block;width:32px;height:32px}.fastboard-toolbar-btn svg,.fastboard-toolbar-btn img{width:100%;height:100%}.fastboard-toolbar-btn:disabled{opacity:.5;cursor:not-allowed}.fastboard-toolbar-btn.light:not(:disabled):hover{background-color:#3381ff1a}.fastboard-toolbar-btn.dark:not(:disabled):hover{background-color:#3381ff40}.fastboard-toolbar-triangle{width:0px;height:0px;border-bottom:4px solid;border-left:4px solid transparent;position:absolute;bottom:0;right:0}.fastboard-toolbar-cut-line{display:inline-block;height:.5px;width:100%}.fastboard-toolbar-cut-line.light{background-color:#e7e7e7}.fastboard-toolbar-cut-line.dark{background-color:#ffffff26}.fastboard-toolbar-section{display:inline-flex;flex-flow:column nowrap;gap:4px;scroll-behavior:smooth}.fastboard-toolbar-section.collapsed{transform:translate(-100%);transition:1s transform}.fastboard-toolbar-panel{width:120px;padding:0;display:flex;flex-flow:column nowrap;align-items:center;gap:8px}.fastboard-toolbar-panel.apps{width:224px}.fastboard-toolbar-color-box,.fastboard-toolbar-shapes{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;align-items:center;justify-items:center}.fastboard-toolbar-color-box .fastboard-toolbar-btn,.fastboard-toolbar-shapes .fastboard-toolbar-btn{padding:0;width:24px;height:24px}.fastboard-toolbar-apps{width:100%;display:grid;grid-template-columns:repeat(3,1fr);gap:8px;align-items:center;justify-items:center}.fastboard-toolbar-apps .fastboard-toolbar-btn{width:40px;height:40px;font-size:0}.fastboard-toolbar-app-icon{padding-top:4px;display:inline-flex;flex-flow:column nowrap;align-items:center;gap:4px}.fastboard-toolbar-app-icon .fastboard-toolbar-btn{padding:0}.fastboard-toolbar-app-icon-text{font-size:12px;color:#5d5d5d;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.fastboard-toolbar-color-item{width:24px;height:24px;border-radius:4px;cursor:pointer}.fastboard-toolbar-color-item *.light:hover{background-color:#f5f5f5}.fastboard-toolbar-color-item *.dark:hover{background-color:#333}.fastboard-toolbar-color-border{width:24px;height:24px;border:1px solid transparent;border-radius:4px;display:inline-flex;align-items:center;justify-content:center}.fastboard-toolbar-color-border.active.light,.fastboard-toolbar-color-border.active.dark{border:1px solid rgba(51,129,255,.8)}.fastboard-toolbar-color-btn{margin:0;border:1px solid rgba(0,0,0,.24);padding:0;appearance:none;width:16px;height:16px;border-radius:4px;cursor:pointer}.fastboard-toolbar-color-btn:focus-visible{outline-offset:2px}.fastboard-toolbar-mask{position:absolute;left:calc(100% + 1px);top:50%;transform:translateY(-50%)}.fastboard-toolbar-mask.dark{left:100%}.fastboard-toolbar-mask-btn{width:17px;height:62px;cursor:pointer}.fastboard-toolbar-mask-btn.dark{filter:invert(.8)}.fastboard-toolbar-expand-btn{display:flex;align-items:center;position:absolute;left:0}.fastboard-player-control{width:100%;display:inline-flex;align-items:center;gap:4px;padding:4px;border-radius:4px;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px)}.fastboard-player-control.auto-hide{opacity:0;transition:opacity .2s}.fastboard-player-control.auto-hide:hover{opacity:1}.fastboard-player-control .rc-slider-disabled{background:transparent;opacity:.5}.fastboard-player-control .rc-slider-rail,.fastboard-player-control .rc-slider-track{height:2px}.fastboard-player-control .tippy-content{padding:8px}.fastboard-player-control .tippy-box{border:1px solid rgba(0,0,0,.15);background-color:#333333f2;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px)}.fastboard-player-control .tippy-box[data-theme~=light]{background-color:#fffffff2;box-shadow:0 5px 10px #00000040}.fastboard-player-control.light{color:#333;background-color:#ffffffd9;border:1px solid rgba(0,0,0,.15)}.fastboard-player-control.dark{color:#ddd;background-color:#333333d9;border:1px solid rgba(0,0,0,.45)}.fastboard-player-control-btn{appearance:none;cursor:pointer;margin:0;border:0;padding:0;min-width:24px;height:24px;background-color:transparent;border-radius:4px;font-size:24px;line-height:1;display:inline-flex;align-items:center;justify-content:center}.fastboard-player-control-btn svg,.fastboard-player-control-btn img{width:1em;height:1em}.fastboard-player-control-btn:disabled{opacity:.5;cursor:not-allowed}.fastboard-player-control-btn.light:not(:disabled):hover{background-color:#3381ff1a}.fastboard-player-control-btn.dark:not(:disabled):hover{background-color:#3381ff40}.fastboard-player-control-btn.loading{animation:fastboard-player-control-rotate .5s linear infinite}@keyframes fastboard-player-control-rotate{to{transform:rotate(360deg)}}.fastboard-player-control-panel{padding:0;display:flex;flex-flow:column nowrap;align-items:stretch;gap:4px}.fastboard-player-control-panel .fastboard-player-control-btn{width:initial;height:initial;user-select:none;font-size:12px;padding:4px;justify-content:flex-end}.fastboard-player-control-panel .fastboard-player-control-btn.active{color:#3381ff}.fastboard-player-control-slider{width:100%;padding:0 7px}.fastboard-player-control-slider.loading{cursor:not-allowed}.fastboard-player-control-slash{opacity:.6}.fastboard-player-control-current,.fastboard-player-control-slash,.fastboard-player-control-total,.fastboard-player-control-speed-text{font-size:12px;font-variant-numeric:tabular-nums}.tippy-box.fastboard-tip{color:#eee;background-color:#000000f2;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px)}.tippy-box.fastboard-tip[data-placement^=right]>.tippy-arrow:before{top:4px;border-width:4px;border-right-color:#000}.tippy-box.fastboard-tip[data-placement^=top]>.tippy-arrow:before{left:4px;border-width:4px;border-top-color:#000}\n';
143
140
 
144
141
  // src/behaviors/style.ts
145
142
  applyStyles(style_default);
@@ -147,8 +144,8 @@ applyStyles(style_default);
147
144
  // src/components/hooks.ts
148
145
  var import_window_manager = require("@netless/window-manager");
149
146
  var import_react2 = require("react");
150
- var FastboardAppContext = (0, import_react2.createContext)(null);
151
- var ThemeContext = (0, import_react2.createContext)("light");
147
+ var FastboardAppContext = /* @__PURE__ */ (0, import_react2.createContext)(null);
148
+ var ThemeContext = /* @__PURE__ */ (0, import_react2.createContext)("light");
152
149
  function useTheme(userTheme) {
153
150
  const themeFromContext = (0, import_react2.useContext)(ThemeContext);
154
151
  return userTheme || themeFromContext;
@@ -293,7 +290,7 @@ var createI18n = async ({
293
290
  });
294
291
  return import_i18next.default;
295
292
  };
296
- var I18nContext = (0, import_react4.createContext)(null);
293
+ var I18nContext = /* @__PURE__ */ (0, import_react4.createContext)(null);
297
294
  function useTranslation() {
298
295
  const i18n = (0, import_react4.useContext)(I18nContext);
299
296
  const t = (0, import_react4.useMemo)(() => i18n ? i18n.getFixedT(null, ["translation"]) : (id) => id, [i18n]);
@@ -303,7 +300,7 @@ function useTranslation() {
303
300
  // src/icons/index.tsx
304
301
  var import_react5 = __toESM(require("react"));
305
302
  function Icon({ fallback, src, alt = "[icon]" }) {
306
- return src ? import_react5.default.createElement("img", {
303
+ return src ? /* @__PURE__ */ import_react5.default.createElement("img", {
307
304
  src,
308
305
  alt,
309
306
  title: alt
@@ -341,17 +338,17 @@ var RightOffset = [0, 11];
341
338
  function Redo({ theme = "light", active }) {
342
339
  const config = themes[theme];
343
340
  const stroke = active ? config.activeColor : config.color;
344
- return import_react6.default.createElement("svg", {
341
+ return /* @__PURE__ */ import_react6.default.createElement("svg", {
345
342
  viewBox: "0 0 24 24"
346
- }, import_react6.default.createElement("g", {
343
+ }, /* @__PURE__ */ import_react6.default.createElement("g", {
347
344
  fill: "none",
348
345
  fillRule: "evenodd",
349
346
  stroke,
350
347
  strokeLinecap: "round",
351
348
  strokeLinejoin: "round"
352
- }, import_react6.default.createElement("path", {
349
+ }, /* @__PURE__ */ import_react6.default.createElement("path", {
353
350
  d: "M14 14h4v-4"
354
- }), import_react6.default.createElement("path", {
351
+ }), /* @__PURE__ */ import_react6.default.createElement("path", {
355
352
  d: "m18 14-.788-.9A7.005 7.005 0 0 0 6 14h0"
356
353
  })));
357
354
  }
@@ -361,17 +358,17 @@ var import_react7 = __toESM(require("react"));
361
358
  function Undo({ theme = "light", active }) {
362
359
  const config = themes[theme];
363
360
  const stroke = active ? config.activeColor : config.color;
364
- return import_react7.default.createElement("svg", {
361
+ return /* @__PURE__ */ import_react7.default.createElement("svg", {
365
362
  viewBox: "0 0 24 24"
366
- }, import_react7.default.createElement("g", {
363
+ }, /* @__PURE__ */ import_react7.default.createElement("g", {
367
364
  fill: "none",
368
365
  fillRule: "evenodd",
369
366
  stroke,
370
367
  strokeLinecap: "round",
371
368
  strokeLinejoin: "round"
372
- }, import_react7.default.createElement("path", {
369
+ }, /* @__PURE__ */ import_react7.default.createElement("path", {
373
370
  d: "M10 14H6v-4"
374
- }), import_react7.default.createElement("path", {
371
+ }), /* @__PURE__ */ import_react7.default.createElement("path", {
375
372
  d: "m6 14 .788-.9A7.005 7.005 0 0 1 18 14h0"
376
373
  })));
377
374
  }
@@ -384,9 +381,9 @@ function RedoUndo({ theme, undoIcon, undoIconDisable, redoIcon, redoIconDisable
384
381
  const writable = useWritable();
385
382
  const { redoSteps, undoSteps, redo, undo } = useRedoUndo();
386
383
  const disabled = !writable;
387
- return import_react9.default.createElement("div", {
384
+ return /* @__PURE__ */ import_react9.default.createElement("div", {
388
385
  className: (0, import_clsx.default)(name, theme)
389
- }, import_react9.default.createElement(import_react8.default, {
386
+ }, /* @__PURE__ */ import_react9.default.createElement(import_react8.default, {
390
387
  className: "fastboard-tip",
391
388
  content: t("undo"),
392
389
  theme,
@@ -395,17 +392,17 @@ function RedoUndo({ theme, undoIcon, undoIconDisable, redoIcon, redoIconDisable
395
392
  delay: [1e3, 400],
396
393
  duration: 300,
397
394
  offset: TopOffset
398
- }, import_react9.default.createElement("button", {
395
+ }, /* @__PURE__ */ import_react9.default.createElement("button", {
399
396
  className: (0, import_clsx.default)(`${name}-btn`, "undo", theme),
400
397
  disabled: disabled || undoSteps === 0,
401
398
  onClick: undo
402
- }, import_react9.default.createElement(Icon, {
403
- fallback: import_react9.default.createElement(Undo, {
399
+ }, /* @__PURE__ */ import_react9.default.createElement(Icon, {
400
+ fallback: /* @__PURE__ */ import_react9.default.createElement(Undo, {
404
401
  theme
405
402
  }),
406
403
  src: undoSteps === 0 ? undoIconDisable : undoIcon,
407
404
  alt: "[undo]"
408
- }))), import_react9.default.createElement(import_react8.default, {
405
+ }))), /* @__PURE__ */ import_react9.default.createElement(import_react8.default, {
409
406
  className: "fastboard-tip",
410
407
  content: t("redo"),
411
408
  theme,
@@ -414,12 +411,12 @@ function RedoUndo({ theme, undoIcon, undoIconDisable, redoIcon, redoIconDisable
414
411
  delay: [1e3, 400],
415
412
  duration: 300,
416
413
  offset: TopOffset
417
- }, import_react9.default.createElement("button", {
414
+ }, /* @__PURE__ */ import_react9.default.createElement("button", {
418
415
  className: (0, import_clsx.default)(`${name}-btn`, "redo", theme),
419
416
  disabled: disabled || redoSteps === 0,
420
417
  onClick: redo
421
- }, import_react9.default.createElement(Icon, {
422
- fallback: import_react9.default.createElement(Redo, {
418
+ }, /* @__PURE__ */ import_react9.default.createElement(Icon, {
419
+ fallback: /* @__PURE__ */ import_react9.default.createElement(Redo, {
423
420
  theme
424
421
  }),
425
422
  src: redoSteps === 0 ? redoIconDisable : redoIcon,
@@ -501,9 +498,9 @@ var import_react11 = __toESM(require("react"));
501
498
  function Minus({ theme = "light", active }) {
502
499
  const config = themes[theme];
503
500
  const stroke = active ? config.activeColor : config.color;
504
- return import_react11.default.createElement("svg", {
501
+ return /* @__PURE__ */ import_react11.default.createElement("svg", {
505
502
  viewBox: "0 0 24 24"
506
- }, import_react11.default.createElement("path", {
503
+ }, /* @__PURE__ */ import_react11.default.createElement("path", {
507
504
  fill: "none",
508
505
  stroke,
509
506
  strokeLinecap: "round",
@@ -517,9 +514,9 @@ var import_react12 = __toESM(require("react"));
517
514
  function Plus({ theme = "light", active }) {
518
515
  const config = themes[theme];
519
516
  const stroke = active ? config.activeColor : config.color;
520
- return import_react12.default.createElement("svg", {
517
+ return /* @__PURE__ */ import_react12.default.createElement("svg", {
521
518
  viewBox: "0 0 24 24"
522
- }, import_react12.default.createElement("path", {
519
+ }, /* @__PURE__ */ import_react12.default.createElement("path", {
523
520
  fill: "none",
524
521
  stroke,
525
522
  strokeLinecap: "round",
@@ -533,22 +530,22 @@ var import_react13 = __toESM(require("react"));
533
530
  function Reset({ theme = "light", active }) {
534
531
  const config = themes[theme];
535
532
  const stroke = active ? config.activeColor : config.color;
536
- return import_react13.default.createElement("svg", {
533
+ return /* @__PURE__ */ import_react13.default.createElement("svg", {
537
534
  viewBox: "0 0 24 24"
538
- }, import_react13.default.createElement("g", {
535
+ }, /* @__PURE__ */ import_react13.default.createElement("g", {
539
536
  fill: "none",
540
537
  fillRule: "evenodd",
541
538
  transform: "translate(-176 -684)"
542
- }, import_react13.default.createElement("path", {
539
+ }, /* @__PURE__ */ import_react13.default.createElement("path", {
543
540
  stroke,
544
541
  strokeLinejoin: "round",
545
542
  d: "M188 688v4m0 8v4m8-8h-4m-8 0h-4"
546
- }), import_react13.default.createElement("circle", {
543
+ }), /* @__PURE__ */ import_react13.default.createElement("circle", {
547
544
  cx: "188",
548
545
  cy: "696",
549
546
  r: "6",
550
547
  stroke
551
- }), import_react13.default.createElement("circle", {
548
+ }), /* @__PURE__ */ import_react13.default.createElement("circle", {
552
549
  cx: "188",
553
550
  cy: "696",
554
551
  r: "1",
@@ -572,9 +569,9 @@ function ZoomControl({
572
569
  const writable = useWritable();
573
570
  const { scale, resetCamera, zoomIn, zoomOut } = useZoomControl();
574
571
  const disabled = !writable;
575
- return import_react15.default.createElement("div", {
572
+ return /* @__PURE__ */ import_react15.default.createElement("div", {
576
573
  className: (0, import_clsx2.default)(name2, theme)
577
- }, import_react15.default.createElement(import_react14.default, {
574
+ }, /* @__PURE__ */ import_react15.default.createElement(import_react14.default, {
578
575
  className: "fastboard-tip",
579
576
  content: t("zoomOut"),
580
577
  theme,
@@ -583,21 +580,21 @@ function ZoomControl({
583
580
  delay: [1e3, 400],
584
581
  duration: 300,
585
582
  offset: TopOffset
586
- }, import_react15.default.createElement("button", {
583
+ }, /* @__PURE__ */ import_react15.default.createElement("button", {
587
584
  className: (0, import_clsx2.default)(`${name2}-btn`, "minus", theme),
588
585
  disabled,
589
586
  onClick: zoomOut
590
- }, import_react15.default.createElement(Icon, {
591
- fallback: import_react15.default.createElement(Minus, {
587
+ }, /* @__PURE__ */ import_react15.default.createElement(Icon, {
588
+ fallback: /* @__PURE__ */ import_react15.default.createElement(Minus, {
592
589
  theme
593
590
  }),
594
591
  src: disabled ? minusIconDisable : minusIcon,
595
592
  alt: "[minus]"
596
- }))), import_react15.default.createElement("span", {
593
+ }))), /* @__PURE__ */ import_react15.default.createElement("span", {
597
594
  className: (0, import_clsx2.default)(`${name2}-scale`, theme)
598
- }, Math.ceil(scale * 100)), import_react15.default.createElement("span", {
595
+ }, Math.ceil(scale * 100)), /* @__PURE__ */ import_react15.default.createElement("span", {
599
596
  className: (0, import_clsx2.default)(`${name2}-percent`, theme)
600
- }, "%"), import_react15.default.createElement(import_react14.default, {
597
+ }, "%"), /* @__PURE__ */ import_react15.default.createElement(import_react14.default, {
601
598
  className: "fastboard-tip",
602
599
  content: t("zoomIn"),
603
600
  theme,
@@ -606,17 +603,17 @@ function ZoomControl({
606
603
  delay: [1e3, 400],
607
604
  duration: 300,
608
605
  offset: TopOffset
609
- }, import_react15.default.createElement("button", {
606
+ }, /* @__PURE__ */ import_react15.default.createElement("button", {
610
607
  className: (0, import_clsx2.default)(`${name2}-btn`, "plus", theme),
611
608
  disabled,
612
609
  onClick: zoomIn
613
- }, import_react15.default.createElement(Icon, {
614
- fallback: import_react15.default.createElement(Plus, {
610
+ }, /* @__PURE__ */ import_react15.default.createElement(Icon, {
611
+ fallback: /* @__PURE__ */ import_react15.default.createElement(Plus, {
615
612
  theme
616
613
  }),
617
614
  src: disabled ? plusIconDisable : plusIcon,
618
615
  alt: "[plus]"
619
- }))), import_react15.default.createElement(import_react14.default, {
616
+ }))), /* @__PURE__ */ import_react15.default.createElement(import_react14.default, {
620
617
  className: "fastboard-tip",
621
618
  content: t("reset"),
622
619
  theme,
@@ -625,12 +622,12 @@ function ZoomControl({
625
622
  delay: [1e3, 400],
626
623
  duration: 300,
627
624
  offset: TopOffset
628
- }, import_react15.default.createElement("button", {
625
+ }, /* @__PURE__ */ import_react15.default.createElement("button", {
629
626
  className: (0, import_clsx2.default)(`${name2}-btn`, "reset", theme),
630
627
  disabled,
631
628
  onClick: resetCamera
632
- }, import_react15.default.createElement(Icon, {
633
- fallback: import_react15.default.createElement(Reset, {
629
+ }, /* @__PURE__ */ import_react15.default.createElement(Icon, {
630
+ fallback: /* @__PURE__ */ import_react15.default.createElement(Reset, {
634
631
  theme
635
632
  }),
636
633
  src: disabled ? resetIconDisable : resetIcon,
@@ -640,58 +637,21 @@ function ZoomControl({
640
637
 
641
638
  // src/components/PageControl/hooks.ts
642
639
  var import_react16 = require("react");
643
- function usePageControl(room, manager) {
644
- const [pageIndex, setPageIndex] = (0, import_react16.useState)(0);
645
- const [pageCount, setPageCount] = (0, import_react16.useState)(0);
640
+ function usePageControl() {
641
+ const app = useFastboardApp();
642
+ const pageIndex = useFastboardValue(app.sceneIndex);
643
+ const pageCount = useFastboardValue(app.sceneLength);
646
644
  const addPage = (0, import_react16.useCallback)(async () => {
647
- if (manager && room) {
648
- await manager.switchMainViewToWriter();
649
- const path = room.state.sceneState.contextPath;
650
- room.putScenes(path, [{}], pageIndex + 1);
651
- await manager.setMainViewSceneIndex(pageIndex + 1);
652
- } else if (!manager && room) {
653
- const path = room.state.sceneState.contextPath;
654
- room.putScenes(path, [{}], pageIndex + 1);
655
- room.setSceneIndex(pageIndex + 1);
656
- }
657
- }, [room, manager, pageIndex]);
658
- const prevPage = (0, import_react16.useCallback)(() => {
659
- if (manager) {
660
- manager.setMainViewSceneIndex(pageIndex - 1);
661
- } else if (room) {
662
- room.pptPreviousStep();
663
- }
664
- }, [room, manager, pageIndex]);
665
- const nextPage = (0, import_react16.useCallback)(() => {
666
- if (manager) {
667
- manager.setMainViewSceneIndex(pageIndex + 1);
668
- } else if (room) {
669
- room.pptNextStep();
670
- }
671
- }, [room, manager, pageIndex]);
672
- (0, import_react16.useEffect)(() => {
673
- if (room) {
674
- setPageIndex(room.state.sceneState.index);
675
- setPageCount(room.state.sceneState.scenes.length);
676
- if (manager) {
677
- manager.emitter.on("mainViewSceneIndexChange", setPageIndex);
678
- return () => {
679
- manager.emitter.off("mainViewSceneIndexChange", setPageIndex);
680
- };
681
- } else {
682
- const onRoomStateChanged = (modifyState) => {
683
- if (modifyState.sceneState) {
684
- setPageIndex(modifyState.sceneState.index);
685
- setPageCount(modifyState.sceneState.scenes.length);
686
- }
687
- };
688
- room.callbacks.on("onRoomStateChanged", onRoomStateChanged);
689
- return () => {
690
- room.callbacks.off("onRoomStateChanged", onRoomStateChanged);
691
- };
692
- }
693
- }
694
- }, [room, manager]);
645
+ await app.manager.switchMainViewToWriter();
646
+ app.room.putScenes(app.manager.mainViewSceneDir, [{}], pageIndex + 1);
647
+ await app.manager.setMainViewSceneIndex(pageIndex + 1);
648
+ }, [app, pageIndex]);
649
+ const prevPage = (0, import_react16.useCallback)(async () => {
650
+ await app.manager.setMainViewSceneIndex(pageIndex - 1);
651
+ }, [app, pageIndex]);
652
+ const nextPage = (0, import_react16.useCallback)(async () => {
653
+ await app.manager.setMainViewSceneIndex(pageIndex + 1);
654
+ }, [app, pageIndex]);
695
655
  return { pageIndex, pageCount, prevPage, nextPage, addPage };
696
656
  }
697
657
 
@@ -705,9 +665,9 @@ var import_react17 = __toESM(require("react"));
705
665
  function ChevronLeft({ theme = "light", active }) {
706
666
  const config = themes[theme];
707
667
  const stroke = active ? config.activeColor : config.color;
708
- return import_react17.default.createElement("svg", {
668
+ return /* @__PURE__ */ import_react17.default.createElement("svg", {
709
669
  viewBox: "0 0 24 24"
710
- }, import_react17.default.createElement("path", {
670
+ }, /* @__PURE__ */ import_react17.default.createElement("path", {
711
671
  fill: "none",
712
672
  stroke,
713
673
  strokeLinecap: "round",
@@ -721,9 +681,9 @@ var import_react18 = __toESM(require("react"));
721
681
  function ChevronRight({ theme = "light", active }) {
722
682
  const config = themes[theme];
723
683
  const stroke = active ? config.activeColor : config.color;
724
- return import_react18.default.createElement("svg", {
684
+ return /* @__PURE__ */ import_react18.default.createElement("svg", {
725
685
  viewBox: "0 0 24 24"
726
- }, import_react18.default.createElement("path", {
686
+ }, /* @__PURE__ */ import_react18.default.createElement("path", {
727
687
  fill: "none",
728
688
  stroke,
729
689
  strokeLinecap: "round",
@@ -737,9 +697,9 @@ var import_react19 = __toESM(require("react"));
737
697
  function FilePlus({ theme = "light", active }) {
738
698
  const config = themes[theme];
739
699
  const stroke = active ? config.activeColor : config.color;
740
- return import_react19.default.createElement("svg", {
700
+ return /* @__PURE__ */ import_react19.default.createElement("svg", {
741
701
  viewBox: "0 0 24 24"
742
- }, import_react19.default.createElement("path", {
702
+ }, /* @__PURE__ */ import_react19.default.createElement("path", {
743
703
  fill: stroke,
744
704
  d: "M12 7.5a.5.5 0 0 1 .09.992L12 8.5H8a1.5 1.5 0 0 0-1.493 1.356L6.5 10v6a1.5 1.5 0 0 0 1.356 1.493L8 17.5h6a1.5 1.5 0 0 0 1.493-1.356L15.5 16v-4a.5.5 0 0 1 .992-.09l.008.09v4a2.5 2.5 0 0 1-2.336 2.495L14 18.5H8a2.5 2.5 0 0 1-2.495-2.336L5.5 16v-6a2.5 2.5 0 0 1 2.336-2.495L8 7.5h4Zm4-2a.5.5 0 0 1 .492.41L16.5 6v1.5H18a.5.5 0 0 1 .09.992L18 8.5h-1.5V10a.5.5 0 0 1-.992.09L15.5 10V8.5H14a.5.5 0 0 1-.09-.992L14 7.5h1.5V6a.5.5 0 0 1 .5-.5Z"
745
705
  }));
@@ -756,15 +716,14 @@ function PageControl({
756
716
  nextIcon,
757
717
  nextIconDisable
758
718
  }) {
759
- const app = useFastboardApp();
760
719
  theme = useTheme(theme);
761
720
  const { t } = useTranslation();
762
721
  const writable = useWritable();
763
- const _a = usePageControl(app.room, app.manager), { pageIndex, pageCount } = _a, actions = __objRest(_a, ["pageIndex", "pageCount"]);
722
+ const _a = usePageControl(), { pageIndex, pageCount } = _a, actions = __objRest(_a, ["pageIndex", "pageCount"]);
764
723
  const disabled = !writable;
765
- return import_react21.default.createElement("div", {
724
+ return /* @__PURE__ */ import_react21.default.createElement("div", {
766
725
  className: (0, import_clsx3.default)(name3, theme)
767
- }, import_react21.default.createElement(import_react20.default, {
726
+ }, /* @__PURE__ */ import_react21.default.createElement(import_react20.default, {
768
727
  className: "fastboard-tip",
769
728
  content: t("prevPage"),
770
729
  theme,
@@ -773,23 +732,23 @@ function PageControl({
773
732
  delay: [1e3, 400],
774
733
  duration: 300,
775
734
  offset: TopOffset
776
- }, import_react21.default.createElement("button", {
735
+ }, /* @__PURE__ */ import_react21.default.createElement("button", {
777
736
  className: (0, import_clsx3.default)(`${name3}-btn`, "prev", theme),
778
737
  disabled: disabled || pageIndex === 0,
779
738
  onClick: actions.prevPage
780
- }, import_react21.default.createElement(Icon, {
781
- fallback: import_react21.default.createElement(ChevronLeft, {
739
+ }, /* @__PURE__ */ import_react21.default.createElement(Icon, {
740
+ fallback: /* @__PURE__ */ import_react21.default.createElement(ChevronLeft, {
782
741
  theme
783
742
  }),
784
743
  src: disabled ? prevIconDisable : prevIcon,
785
744
  alt: "[prev]"
786
- }))), import_react21.default.createElement("span", {
745
+ }))), /* @__PURE__ */ import_react21.default.createElement("span", {
787
746
  className: (0, import_clsx3.default)(`${name3}-page`, theme)
788
- }, pageCount === 0 ? "\u2026" : pageIndex + 1), import_react21.default.createElement("span", {
747
+ }, pageCount === 0 ? "\u2026" : pageIndex + 1), /* @__PURE__ */ import_react21.default.createElement("span", {
789
748
  className: (0, import_clsx3.default)(`${name3}-slash`, theme)
790
- }, "/"), import_react21.default.createElement("span", {
749
+ }, "/"), /* @__PURE__ */ import_react21.default.createElement("span", {
791
750
  className: (0, import_clsx3.default)(`${name3}-page-count`, theme)
792
- }, pageCount), import_react21.default.createElement(import_react20.default, {
751
+ }, pageCount), /* @__PURE__ */ import_react21.default.createElement(import_react20.default, {
793
752
  className: "fastboard-tip",
794
753
  content: t("nextPage"),
795
754
  theme,
@@ -798,17 +757,17 @@ function PageControl({
798
757
  delay: [1e3, 400],
799
758
  duration: 300,
800
759
  offset: TopOffset
801
- }, import_react21.default.createElement("button", {
760
+ }, /* @__PURE__ */ import_react21.default.createElement("button", {
802
761
  className: (0, import_clsx3.default)(`${name3}-btn`, "next", theme),
803
762
  disabled: disabled || pageIndex === pageCount - 1,
804
763
  onClick: actions.nextPage
805
- }, import_react21.default.createElement(Icon, {
806
- fallback: import_react21.default.createElement(ChevronRight, {
764
+ }, /* @__PURE__ */ import_react21.default.createElement(Icon, {
765
+ fallback: /* @__PURE__ */ import_react21.default.createElement(ChevronRight, {
807
766
  theme
808
767
  }),
809
768
  src: disabled ? nextIconDisable : nextIcon,
810
769
  alt: "[next]"
811
- }))), import_react21.default.createElement(import_react20.default, {
770
+ }))), /* @__PURE__ */ import_react21.default.createElement(import_react20.default, {
812
771
  className: "fastboard-tip",
813
772
  content: t("addPage"),
814
773
  theme,
@@ -817,12 +776,12 @@ function PageControl({
817
776
  delay: [1e3, 400],
818
777
  duration: 300,
819
778
  offset: TopOffset
820
- }, import_react21.default.createElement("button", {
779
+ }, /* @__PURE__ */ import_react21.default.createElement("button", {
821
780
  className: (0, import_clsx3.default)(`${name3}-btn`, "add", theme),
822
781
  disabled,
823
782
  onClick: actions.addPage
824
- }, import_react21.default.createElement(Icon, {
825
- fallback: import_react21.default.createElement(FilePlus, {
783
+ }, /* @__PURE__ */ import_react21.default.createElement(Icon, {
784
+ fallback: /* @__PURE__ */ import_react21.default.createElement(FilePlus, {
826
785
  theme
827
786
  }),
828
787
  src: disabled ? addIconDisable : addIcon,
@@ -872,94 +831,56 @@ var EmptyToolbarHook = {
872
831
  // src/components/Toolbar/Toolbar.tsx
873
832
  var import_clsx9 = __toESM(require("clsx"));
874
833
  var import_framer_motion = require("framer-motion");
875
- var import_react60 = __toESM(require("react"));
876
-
877
- // src/components/Toolbar/components/assets/collapsed.png
878
- var collapsed_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAB8CAYAAAAMw2JFAAAAAXNSR0IArs4c6QAAA49JREFUeF7tnLFv00AUh5/TFVYkxIDEnKFjJ/gb2CIqpUPagYXNEV2LRGk7tAiRSA0bWcC0QzowwQKuVDnCLE2KTZCMSNLkHCLalCpBkdFVMTKh8TXO+c4S16XDSb0vv/vyfE3fqwQR+ZIA4AoAdADgJ08mSVXVV9ls9nE+nzcBAAFAnweQ1Gg06gihrmEYubm5OeX4+LgBAD9Yw0iO49S63S7U6/VYq9UyCoXC2tLS0kcAwEA9VkBnIO5m7XYbJwTVanVLluWcruvfAOA7ADhhA/0Fgjfr9/tweHgYs20baZq2sbCw8HaQTqgy/wPivvKTkxN8XFPNZvMdC5lHgmAgx3EAISQhhHqGYWyGKbMviJsOC5kvBOIjcxUAWjRkHgtkSGZb07R1WjKPDeIj82cAaAatzIFBhmU2TTOXTCZfBq3ME4HQlJkKCA2ZqYJMIjN1kKAyhwYyrsyhgpwns6IoyysrK/rgQfrnqc4ExCtzrVb7tbe39yCVSr0GAFyZz2CYguANT09PwbIsaWdn5146nX4zuO+wB8EwnU5HqlQqdiKRuHNwcFDC1Zh5Iu4xWZYVU1V1eXZ29jlOhRvI0dGRVC6XP8zMzNwFgK/cQHq9HpTLZXt6evo2AFS4geDbX6lUisXj8VsA8IkbCHZlf39/Kh6P3xQg7jtHJDL826JIRCRC+gRBOCIcEY6QEhCOkBISdUQ4IhwhJSAcISUk6kjojjxaXbt0Py3jP1DCtes3ruLvVetLnenRYIgnT7OX3Y25gLgQ3gSYg3ghuIEMQ3ABOQ+COcgoCKYgfhD/Jwh+1ZE4GrdKRkJWPxhulTUSBe28ZLglMgzDHcR9N3G/BpDuHH7r4qoY+lUx6PGIoxFHQ3JHOCIcEY6QEhCOkBISdUQ4IhwhJSAcISUk6ohwxM+RyLR/RaYhLjItgpFomoxEG2kkGmvxRBPXVmPPWIypKMpD5s3X3kEh0zSfJZPJF6NmK0JrI3VHpxBCaiaTWc/n877TJtRBPMNkdrFY3Jifn8ed3njUzneYjCqIZ7xue3FxMadpGh6vu9BEEhUQr4yFQmE1yMDhRCDjyEi6JAUGGVdG6iBBZaQK4pVRluVNXdfZjsfRkHGiRGjKGBjEI+P7TCazQaqMpI1I635jtmNVRtJGpPVRg8fbtGW8EAiL6VUiyGA4vUd6TJN+0KTr0u7u7hYLGUmg0fkHBiRSVuu/AWpfZNft9vFDAAAAAElFTkSuQmCC";
834
+ var import_react59 = __toESM(require("react"));
879
835
 
880
836
  // src/components/Toolbar/components/assets/expanded.png
881
837
  var expanded_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAB8CAYAAAAMw2JFAAAAAXNSR0IArs4c6QAAA5xJREFUeF7tnL9v00AUx5/TlRkJMSAxZ+jYCf4GtopK6dB2qBBsjshaJErboWVJpYaNLGDaIR2YYAFXqlxhlvzAJkhGJGlyDhVNSpWgyOiqBJnQ+urznW2Jy1JVVnKffv3x8yV9LxLE5CEBwFUA6ALAzyiZJFVVX21ubj7N5/MmACAAGEQBJDWbzQZCqGcYRm52dlbpdDpNAPgRNozkOE691+tBo9FItNtto1AorC0tLX0EAAzUDwvoDGS02NHREU4IarXatizLOV3XvwHAdwBweAP9BYIXGwwGcHh4mLBtG2matrGwsPB2mA5Xmf8BGf3lJycn+HRNtFqtd2HIfCEIBnIcBxBCEkKobxjGFk+ZPUFG6YQh86VAPGSuAUCbhcy+QMZktjVNW2cls28QD5k/A0CLtjJTg4zLbJpmLpVKvaStzIFAWMrMBISFzExBgsjMHIRWZm4gfmXmCnKezIqiLK+srOjDG+mfu3ooIG6Z6/X6r/39/Udzc3OvAQBX5jOYUEHwgqenp2BZlrS7u/sgnU6/Ge53wgfBMN1uV6pWq/b09PTdSqVSwtU49ERGp8myrISqqsszMzPPcSqRgRwfH0vlcvnD1NTUIgB8jQyk3+9DuVy2Jycn7wBANTIQvPsrlUqJZDJ5GwA+RQaCXSkWixPJZPKWABldOSKR8XeLIhGRCOkTBOGIcEQ4QkpAOEJKSNQR4YhwhJSAcISUkKgjTBy5fuPmNfxCNetLA/98srp25WFaxv+UpH5QnZpxEPz7/XuLnSAwzEBwFEFgmIIEgWEOQgvDBYQGhhuIXxiuIH5g/g8QP5czt0T8QFB/mHdeZXXXdr8QXEBoIJiD0EIwBQkCwQwksm0A9abD44lUl68A4ZEAkz0rDzDhiDg1JK+EI8IR4QgpAeEIKSFRR4QjwhFSAsIRUkKijsTSkdi0f8WmIS42LYKxaJqMRRtpLBpr8URTpK3GrrEYU1GUx6E3X7sHhUzTfJZKpV5cNFvBrY10NDqFEFKz2ex6Pp/3nDZhDuIaJrMPDg425ufncac3HrXzHCZjCuIar9vJZDI5TdPweN2lJpKYgLhlLBQKqzQDh4FA/MhI2ptQg/iVkTkIrYxMQdwyyrK8pet6uONxLGQMlAhLGalBXDK+z2azG6TKSFqIdNxrzNZXZSQtRDp+0eDxDmsZLwUSxvQqEWQ4nN4n3aZJLxT0uLS3t7cdhowk0Ph8gQGJNKzjvwGKWUjXcvHclAAAAABJRU5ErkJggg==";
882
838
 
883
- // src/components/Toolbar/components/Mask.tsx
884
- var import_react23 = __toESM(require("react"));
885
- var import_react_dom = __toESM(require("react-dom"));
886
- var Mask = import_react23.default.memo(({ toolbar, children }) => {
887
- const [rootElement] = (0, import_react23.useState)(() => {
888
- const element = document.createElement("div");
889
- element.style.position = "absolute";
890
- return element;
891
- });
892
- (0, import_react23.useEffect)(() => {
893
- if (toolbar && rootElement) {
894
- toolbar.appendChild(rootElement);
895
- }
896
- }, [rootElement, toolbar]);
897
- (0, import_react23.useEffect)(() => {
898
- if (rootElement && toolbar) {
899
- toolbar.appendChild(rootElement);
900
- const toolbarRect = toolbar.getBoundingClientRect();
901
- const halfHeight = toolbarRect.height / 2 - 31;
902
- rootElement.style.top = halfHeight + "px";
903
- rootElement.style.left = "41px";
904
- rootElement.style.width = "17px";
905
- rootElement.style.height = "62px";
906
- return () => {
907
- toolbar.removeChild(rootElement);
908
- };
909
- }
910
- }, [rootElement, toolbar]);
911
- if (rootElement) {
912
- return import_react_dom.default.createPortal(children, rootElement);
913
- } else {
914
- return null;
915
- }
916
- });
917
-
918
839
  // src/components/Toolbar/Content.tsx
919
840
  var import_clsx8 = __toESM(require("clsx"));
920
- var import_react59 = __toESM(require("react"));
841
+ var import_react58 = __toESM(require("react"));
921
842
 
922
843
  // src/components/Toolbar/components/ApplianceButtons.tsx
923
- var import_react46 = __toESM(require("react"));
844
+ var import_react45 = __toESM(require("react"));
924
845
  var import_white_web_sdk = require("white-web-sdk");
925
846
 
926
847
  // src/components/Toolbar/icons/index.ts
927
- var import_react43 = require("react");
848
+ var import_react42 = require("react");
928
849
 
929
850
  // src/components/Toolbar/icons/Apps.tsx
930
- var import_react24 = __toESM(require("react"));
851
+ var import_react23 = __toESM(require("react"));
931
852
  var Apps = (props) => {
932
853
  const stroke = getStroke(props);
933
- return import_react24.default.createElement("svg", {
854
+ return /* @__PURE__ */ import_react23.default.createElement("svg", {
934
855
  viewBox: "0 0 24 24"
935
- }, import_react24.default.createElement("g", {
856
+ }, /* @__PURE__ */ import_react23.default.createElement("g", {
936
857
  fill: stroke
937
- }, import_react24.default.createElement("path", {
858
+ }, /* @__PURE__ */ import_react23.default.createElement("path", {
938
859
  d: "M17.667 4.5h-3.334c-1.012 0-1.833.82-1.833 1.833V11.5h5.167c1.012 0 1.833-.82 1.833-1.833V6.333c0-1.012-.82-1.833-1.833-1.833Zm-3.334 1h3.334c.46 0 .833.373.833.833v3.334l-.006.104a.833.833 0 0 1-.827.729H13.5V6.333c0-.46.373-.833.833-.833Z"
939
- }), import_react24.default.createElement("path", {
860
+ }), /* @__PURE__ */ import_react23.default.createElement("path", {
940
861
  d: "M6.333 19.5A1.833 1.833 0 0 1 4.5 17.667v-3.334c0-.525.221-1 .576-1.334a1.822 1.822 0 0 1-.576-1.332V8.333c0-1.012.82-1.833 1.833-1.833H10A1.5 1.5 0 0 1 11.5 8v4.5h4.167c.962 0 1.75.74 1.827 1.683l.006.15v3.334c0 1.012-.82 1.833-1.833 1.833Zm4.167-6H6.333a.833.833 0 0 0-.827.729l-.006.104v3.334c0 .46.373.833.833.833H10.5v-5Zm5.167 0H11.5v5h4.167c.46 0 .833-.373.833-.833v-3.334a.833.833 0 0 0-.833-.833ZM10 7.5H6.333a.833.833 0 0 0-.833.833v3.334c0 .46.373.833.833.833H10.5V8a.5.5 0 0 0-.41-.492L10 7.5Z"
941
862
  })));
942
863
  };
943
864
 
944
865
  // src/components/Toolbar/icons/Arrow.tsx
945
- var import_react25 = __toESM(require("react"));
866
+ var import_react24 = __toESM(require("react"));
946
867
  var Arrow = (props) => {
947
868
  const stroke = getStroke(props);
948
- return import_react25.default.createElement("svg", {
869
+ return /* @__PURE__ */ import_react24.default.createElement("svg", {
949
870
  viewBox: "0 0 24 24"
950
- }, import_react25.default.createElement("path", {
871
+ }, /* @__PURE__ */ import_react24.default.createElement("path", {
951
872
  fill: stroke,
952
873
  d: "M19 5v6l-2.647-2.646L5.99 18.718l-.708-.708L15.645 7.646 13 5h6Z"
953
874
  }));
954
875
  };
955
876
 
956
877
  // src/components/Toolbar/icons/Circle.tsx
957
- var import_react26 = __toESM(require("react"));
878
+ var import_react25 = __toESM(require("react"));
958
879
  var Circle = (props) => {
959
880
  const stroke = getStroke(props);
960
- return import_react26.default.createElement("svg", {
881
+ return /* @__PURE__ */ import_react25.default.createElement("svg", {
961
882
  viewBox: "0 0 24 24"
962
- }, import_react26.default.createElement("rect", {
883
+ }, /* @__PURE__ */ import_react25.default.createElement("rect", {
963
884
  width: "15",
964
885
  height: "15",
965
886
  x: "4.5",
@@ -971,40 +892,40 @@ var Circle = (props) => {
971
892
  };
972
893
 
973
894
  // src/components/Toolbar/icons/Clean.tsx
974
- var import_react27 = __toESM(require("react"));
895
+ var import_react26 = __toESM(require("react"));
975
896
  var Clean = (props) => {
976
897
  const stroke = getStroke(props);
977
- return import_react27.default.createElement("svg", {
898
+ return /* @__PURE__ */ import_react26.default.createElement("svg", {
978
899
  viewBox: "0 0 24 24"
979
- }, import_react27.default.createElement("path", {
900
+ }, /* @__PURE__ */ import_react26.default.createElement("path", {
980
901
  fill: stroke,
981
902
  d: "M9.754 11.99c0 1.856-.711 3.62-1.96 4.951l-.151.155h1.403l.855-.853h.707l.853.853h2.635l.094-.064a6.237 6.237 0 0 0 2.559-4.781l.005-.26h1a7.237 7.237 0 0 1-2.994 5.862l-.229.16-.277.083h-3l-.353-.146-.647-.647-.646.647-.354.146h-3l-.286-.91.214-.148a6.237 6.237 0 0 0 2.567-4.787l.005-.26h1Zm4.772-6.502v2l.35.039a2.98 2.98 0 0 1 2.644 2.78l.006.181h-8a2.98 2.98 0 0 1 2.65-2.961l.35-.039v-2h2Z"
982
903
  }));
983
904
  };
984
905
 
985
906
  // src/components/Toolbar/icons/Clicker.tsx
986
- var import_react28 = __toESM(require("react"));
907
+ var import_react27 = __toESM(require("react"));
987
908
  var Clicker = (props) => {
988
909
  const stroke = getStroke(props);
989
- return import_react28.default.createElement("svg", {
910
+ return /* @__PURE__ */ import_react27.default.createElement("svg", {
990
911
  viewBox: "0 0 24 24"
991
- }, import_react28.default.createElement("g", {
912
+ }, /* @__PURE__ */ import_react27.default.createElement("g", {
992
913
  fill: "none"
993
- }, import_react28.default.createElement("path", {
914
+ }, /* @__PURE__ */ import_react27.default.createElement("path", {
994
915
  d: "M0 0h24v24H0z"
995
- }), import_react28.default.createElement("path", {
916
+ }), /* @__PURE__ */ import_react27.default.createElement("path", {
996
917
  fill: stroke,
997
918
  d: "m7 5.072 10.33 7.892-4.879.549 3.232 5.598-.866.5-3.233-5.597-2.914 3.95L7 5.072Z"
998
919
  })));
999
920
  };
1000
921
 
1001
922
  // src/components/Toolbar/icons/Collapse.tsx
1002
- var import_react29 = __toESM(require("react"));
923
+ var import_react28 = __toESM(require("react"));
1003
924
  var Collapse = (props) => {
1004
925
  const stroke = getStroke(props);
1005
- return import_react29.default.createElement("svg", {
926
+ return /* @__PURE__ */ import_react28.default.createElement("svg", {
1006
927
  viewBox: "0 0 24 24"
1007
- }, import_react29.default.createElement("path", {
928
+ }, /* @__PURE__ */ import_react28.default.createElement("path", {
1008
929
  fill: "none",
1009
930
  stroke,
1010
931
  d: "m8 10-2 2 2 2m10-8H6m12 12H6m12-4h-8m8-4h-8"
@@ -1012,12 +933,12 @@ var Collapse = (props) => {
1012
933
  };
1013
934
 
1014
935
  // src/components/Toolbar/icons/Diamond.tsx
1015
- var import_react30 = __toESM(require("react"));
936
+ var import_react29 = __toESM(require("react"));
1016
937
  var Diamond = (props) => {
1017
938
  const stroke = getStroke(props);
1018
- return import_react30.default.createElement("svg", {
939
+ return /* @__PURE__ */ import_react29.default.createElement("svg", {
1019
940
  viewBox: "0 0 24 24"
1020
- }, import_react30.default.createElement("path", {
941
+ }, /* @__PURE__ */ import_react29.default.createElement("path", {
1021
942
  fill: "none",
1022
943
  stroke,
1023
944
  d: "M4.222 12 12 4.222 19.778 12 12 19.778z"
@@ -1025,12 +946,12 @@ var Diamond = (props) => {
1025
946
  };
1026
947
 
1027
948
  // src/components/Toolbar/icons/Down.tsx
1028
- var import_react31 = __toESM(require("react"));
949
+ var import_react30 = __toESM(require("react"));
1029
950
  var Down = (props) => {
1030
951
  const stroke = getStroke(props);
1031
- return import_react31.default.createElement("svg", {
952
+ return /* @__PURE__ */ import_react30.default.createElement("svg", {
1032
953
  viewBox: "0 0 24 24"
1033
- }, import_react31.default.createElement("path", {
954
+ }, /* @__PURE__ */ import_react30.default.createElement("path", {
1034
955
  fill: "none",
1035
956
  stroke,
1036
957
  d: "m16 13-2 2-2 2-2-2-2-2m8-6-2 2-2 2-2-2-2-2"
@@ -1038,24 +959,24 @@ var Down = (props) => {
1038
959
  };
1039
960
 
1040
961
  // src/components/Toolbar/icons/Eraser.tsx
1041
- var import_react32 = __toESM(require("react"));
962
+ var import_react31 = __toESM(require("react"));
1042
963
  var Eraser = (props) => {
1043
964
  const stroke = getStroke(props);
1044
- return import_react32.default.createElement("svg", {
965
+ return /* @__PURE__ */ import_react31.default.createElement("svg", {
1045
966
  viewBox: "0 0 24 24"
1046
- }, import_react32.default.createElement("path", {
967
+ }, /* @__PURE__ */ import_react31.default.createElement("path", {
1047
968
  fill: stroke,
1048
969
  d: "m14.333 5.183.165.007c.494.037.978.245 1.356.623l2.333 2.333a2.15 2.15 0 0 1 0 3.04l-5.833 5.834a3.8 3.8 0 0 1-5.374 0l-1.167-1.166a2.15 2.15 0 0 1 0-3.04l7-7c.42-.42.97-.63 1.52-.63ZM11.52 8.52l-4.999 5a1.15 1.15 0 0 0 0 1.626l1.167 1.167a2.8 2.8 0 0 0 3.96 0l3.832-3.833-3.96-3.96Z"
1049
970
  }));
1050
971
  };
1051
972
 
1052
973
  // src/components/Toolbar/icons/Expand.tsx
1053
- var import_react33 = __toESM(require("react"));
974
+ var import_react32 = __toESM(require("react"));
1054
975
  var Expand = (props) => {
1055
976
  const stroke = getStroke(props);
1056
- return import_react33.default.createElement("svg", {
977
+ return /* @__PURE__ */ import_react32.default.createElement("svg", {
1057
978
  viewBox: "0 0 24 24"
1058
- }, import_react33.default.createElement("path", {
979
+ }, /* @__PURE__ */ import_react32.default.createElement("path", {
1059
980
  fill: "none",
1060
981
  stroke,
1061
982
  d: "m16 10 2 2-2 2M6 6h12M6 18h12M6 14h8m-8-4h8"
@@ -1063,36 +984,36 @@ var Expand = (props) => {
1063
984
  };
1064
985
 
1065
986
  // src/components/Toolbar/icons/Line.tsx
1066
- var import_react34 = __toESM(require("react"));
987
+ var import_react33 = __toESM(require("react"));
1067
988
  var Line = (props) => {
1068
989
  const stroke = getStroke(props);
1069
- return import_react34.default.createElement("svg", {
990
+ return /* @__PURE__ */ import_react33.default.createElement("svg", {
1070
991
  viewBox: "0 0 24 24"
1071
- }, import_react34.default.createElement("path", {
992
+ }, /* @__PURE__ */ import_react33.default.createElement("path", {
1072
993
  fill: stroke,
1073
994
  d: "m18.01 5.282.708.708L5.99 18.718l-.708-.708z"
1074
995
  }));
1075
996
  };
1076
997
 
1077
998
  // src/components/Toolbar/icons/Pencil.tsx
1078
- var import_react35 = __toESM(require("react"));
999
+ var import_react34 = __toESM(require("react"));
1079
1000
  var Pencil = (props) => {
1080
1001
  const stroke = getStroke(props);
1081
- return import_react35.default.createElement("svg", {
1002
+ return /* @__PURE__ */ import_react34.default.createElement("svg", {
1082
1003
  viewBox: "0 0 24 24"
1083
- }, import_react35.default.createElement("path", {
1004
+ }, /* @__PURE__ */ import_react34.default.createElement("path", {
1084
1005
  fill: stroke,
1085
1006
  d: "m17.497 4.84.116.105 1.442 1.442a1.52 1.52 0 0 1 .104 2.034l-.104.116L8.733 18.858l-4.347.756.756-4.347L15.463 4.945a1.52 1.52 0 0 1 2.034-.104ZM5.967 16.349l-.353 2.037 2.037-.354-1.683-1.683Zm8.407-8.901-7.946 7.946 2.178 2.178 7.946-7.946-2.178-2.178Zm-.728 2.2.708.707-5 5-.708-.708 5-5Zm2.596-4.055-.072.06-1.09 1.088 2.179 2.178 1.089-1.088a.52.52 0 0 0 .105-.584l-.045-.08-.06-.072-1.442-1.442a.52.52 0 0 0-.664-.06Z"
1086
1007
  }));
1087
1008
  };
1088
1009
 
1089
1010
  // src/components/Toolbar/icons/Rectangle.tsx
1090
- var import_react36 = __toESM(require("react"));
1011
+ var import_react35 = __toESM(require("react"));
1091
1012
  var Rectangle = (props) => {
1092
1013
  const stroke = getStroke(props);
1093
- return import_react36.default.createElement("svg", {
1014
+ return /* @__PURE__ */ import_react35.default.createElement("svg", {
1094
1015
  viewBox: "0 0 24 24"
1095
- }, import_react36.default.createElement("path", {
1016
+ }, /* @__PURE__ */ import_react35.default.createElement("path", {
1096
1017
  fill: "none",
1097
1018
  stroke,
1098
1019
  d: "M5.5 5.5h13v13h-13z"
@@ -1100,24 +1021,24 @@ var Rectangle = (props) => {
1100
1021
  };
1101
1022
 
1102
1023
  // src/components/Toolbar/icons/Selector.tsx
1103
- var import_react37 = __toESM(require("react"));
1024
+ var import_react36 = __toESM(require("react"));
1104
1025
  var Selector = (props) => {
1105
1026
  const stroke = getStroke(props);
1106
- return import_react37.default.createElement("svg", {
1027
+ return /* @__PURE__ */ import_react36.default.createElement("svg", {
1107
1028
  viewBox: "0 0 24 24"
1108
- }, import_react37.default.createElement("path", {
1029
+ }, /* @__PURE__ */ import_react36.default.createElement("path", {
1109
1030
  fill: stroke,
1110
1031
  d: "m12 12 8 2.667-3.556 1.777L14.667 20 12 12Zm3-8v7.5h-1V5H5v9h6.5v1H4V4h11Z"
1111
1032
  }));
1112
1033
  };
1113
1034
 
1114
1035
  // src/components/Toolbar/icons/SpeechBalloon.tsx
1115
- var import_react38 = __toESM(require("react"));
1036
+ var import_react37 = __toESM(require("react"));
1116
1037
  var SpeechBalloon = (props) => {
1117
1038
  const stroke = getStroke(props);
1118
- return import_react38.default.createElement("svg", {
1039
+ return /* @__PURE__ */ import_react37.default.createElement("svg", {
1119
1040
  viewBox: "0 0 24 24"
1120
- }, import_react38.default.createElement("path", {
1041
+ }, /* @__PURE__ */ import_react37.default.createElement("path", {
1121
1042
  fill: "none",
1122
1043
  stroke,
1123
1044
  d: "M17 4.5c.414 0 .79.168 1.06.44.272.27.44.646.44 1.06v9c0 .414-.168.79-.44 1.06a1.49 1.49 0 0 1-1.06.44h-4.207l-2.715 2.715-1.81-2.715H7a1.49 1.49 0 0 1-1.06-.44A1.495 1.495 0 0 1 5.5 15V6c0-.414.168-.79.44-1.06A1.49 1.49 0 0 1 7 4.5Z"
@@ -1125,12 +1046,12 @@ var SpeechBalloon = (props) => {
1125
1046
  };
1126
1047
 
1127
1048
  // src/components/Toolbar/icons/Star.tsx
1128
- var import_react39 = __toESM(require("react"));
1049
+ var import_react38 = __toESM(require("react"));
1129
1050
  var Star = (props) => {
1130
1051
  const stroke = getStroke(props);
1131
- return import_react39.default.createElement("svg", {
1052
+ return /* @__PURE__ */ import_react38.default.createElement("svg", {
1132
1053
  viewBox: "0 0 24 24"
1133
- }, import_react39.default.createElement("path", {
1054
+ }, /* @__PURE__ */ import_react38.default.createElement("path", {
1134
1055
  fill: "none",
1135
1056
  stroke,
1136
1057
  d: "m12 3.523 1.993 5.734 6.07.123-4.838 3.668 1.758 5.81L12 15.391l-4.983 3.467 1.758-5.81L3.938 9.38l6.069-.123L12 3.523Z"
@@ -1138,24 +1059,24 @@ var Star = (props) => {
1138
1059
  };
1139
1060
 
1140
1061
  // src/components/Toolbar/icons/Text.tsx
1141
- var import_react40 = __toESM(require("react"));
1062
+ var import_react39 = __toESM(require("react"));
1142
1063
  var Text = (props) => {
1143
1064
  const stroke = getStroke(props);
1144
- return import_react40.default.createElement("svg", {
1065
+ return /* @__PURE__ */ import_react39.default.createElement("svg", {
1145
1066
  viewBox: "0 0 24 24"
1146
- }, import_react40.default.createElement("path", {
1067
+ }, /* @__PURE__ */ import_react39.default.createElement("path", {
1147
1068
  fill: stroke,
1148
1069
  d: "M18.5 5.5V8h-1V6.5H13v11h2v1H9v-1h2v-11H6.5V8h-1V5.5h13Z"
1149
1070
  }));
1150
1071
  };
1151
1072
 
1152
1073
  // src/components/Toolbar/icons/Triangle.tsx
1153
- var import_react41 = __toESM(require("react"));
1074
+ var import_react40 = __toESM(require("react"));
1154
1075
  var Triangle = (props) => {
1155
1076
  const stroke = getStroke(props);
1156
- return import_react41.default.createElement("svg", {
1077
+ return /* @__PURE__ */ import_react40.default.createElement("svg", {
1157
1078
  viewBox: "0 0 24 24"
1158
- }, import_react41.default.createElement("path", {
1079
+ }, /* @__PURE__ */ import_react40.default.createElement("path", {
1159
1080
  fill: "none",
1160
1081
  stroke,
1161
1082
  d: "M12 6.008 19.138 18.5H4.862L12 6.008Z"
@@ -1163,12 +1084,12 @@ var Triangle = (props) => {
1163
1084
  };
1164
1085
 
1165
1086
  // src/components/Toolbar/icons/Up.tsx
1166
- var import_react42 = __toESM(require("react"));
1087
+ var import_react41 = __toESM(require("react"));
1167
1088
  var Up = (props) => {
1168
1089
  const stroke = getStroke(props);
1169
- return import_react42.default.createElement("svg", {
1090
+ return /* @__PURE__ */ import_react41.default.createElement("svg", {
1170
1091
  viewBox: "0 0 24 24"
1171
- }, import_react42.default.createElement("path", {
1092
+ }, /* @__PURE__ */ import_react41.default.createElement("path", {
1172
1093
  fill: "none",
1173
1094
  stroke,
1174
1095
  d: "m16 11-2-2-2-2-2 2-2 2m8 6-2-2-2-2-2 2-2 2"
@@ -1177,35 +1098,35 @@ var Up = (props) => {
1177
1098
 
1178
1099
  // src/components/Toolbar/icons/index.ts
1179
1100
  var Icons = {
1180
- Clicker: (0, import_react43.memo)(Clicker),
1181
- Collapse: (0, import_react43.memo)(Collapse),
1182
- Eraser: (0, import_react43.memo)(Eraser),
1183
- Expand: (0, import_react43.memo)(Expand),
1184
- Pencil: (0, import_react43.memo)(Pencil),
1185
- Selector: (0, import_react43.memo)(Selector),
1186
- Rectangle: (0, import_react43.memo)(Rectangle),
1187
- Text: (0, import_react43.memo)(Text),
1188
- Apps: (0, import_react43.memo)(Apps),
1189
- Clean: (0, import_react43.memo)(Clean),
1190
- Circle: (0, import_react43.memo)(Circle),
1191
- Line: (0, import_react43.memo)(Line),
1192
- Arrow: (0, import_react43.memo)(Arrow),
1193
- Star: (0, import_react43.memo)(Star),
1194
- Diamond: (0, import_react43.memo)(Diamond),
1195
- SpeechBalloon: (0, import_react43.memo)(SpeechBalloon),
1196
- Triangle: (0, import_react43.memo)(Triangle),
1197
- Up: (0, import_react43.memo)(Up),
1198
- Down: (0, import_react43.memo)(Down)
1101
+ Clicker: (0, import_react42.memo)(Clicker),
1102
+ Collapse: (0, import_react42.memo)(Collapse),
1103
+ Eraser: (0, import_react42.memo)(Eraser),
1104
+ Expand: (0, import_react42.memo)(Expand),
1105
+ Pencil: (0, import_react42.memo)(Pencil),
1106
+ Selector: (0, import_react42.memo)(Selector),
1107
+ Rectangle: (0, import_react42.memo)(Rectangle),
1108
+ Text: (0, import_react42.memo)(Text),
1109
+ Apps: (0, import_react42.memo)(Apps),
1110
+ Clean: (0, import_react42.memo)(Clean),
1111
+ Circle: (0, import_react42.memo)(Circle),
1112
+ Line: (0, import_react42.memo)(Line),
1113
+ Arrow: (0, import_react42.memo)(Arrow),
1114
+ Star: (0, import_react42.memo)(Star),
1115
+ Diamond: (0, import_react42.memo)(Diamond),
1116
+ SpeechBalloon: (0, import_react42.memo)(SpeechBalloon),
1117
+ Triangle: (0, import_react42.memo)(Triangle),
1118
+ Up: (0, import_react42.memo)(Up),
1119
+ Down: (0, import_react42.memo)(Down)
1199
1120
  };
1200
1121
 
1201
1122
  // src/components/Toolbar/components/Button.tsx
1202
1123
  var import_clsx4 = __toESM(require("clsx"));
1203
- var import_react44 = __toESM(require("react"));
1204
- var import_react45 = __toESM(require("@tippyjs/react"));
1205
- var Button = (0, import_react44.forwardRef)((props, ref) => {
1124
+ var import_react43 = __toESM(require("react"));
1125
+ var import_react44 = __toESM(require("@tippyjs/react"));
1126
+ var Button = (0, import_react43.forwardRef)((props, ref) => {
1206
1127
  const { content, disabled, active, onClick, interactive, placement = "right", children } = props;
1207
- const { writable, theme } = (0, import_react44.useContext)(ToolbarContext);
1208
- return import_react44.default.createElement(import_react45.default, {
1128
+ const { writable, theme } = (0, import_react43.useContext)(ToolbarContext);
1129
+ return /* @__PURE__ */ import_react43.default.createElement(import_react44.default, {
1209
1130
  className: "fastboard-tip",
1210
1131
  content,
1211
1132
  interactive,
@@ -1215,7 +1136,7 @@ var Button = (0, import_react44.forwardRef)((props, ref) => {
1215
1136
  offset: placement.includes("right") ? RightOffset : void 0,
1216
1137
  delay: [1e3, 400],
1217
1138
  duration: 300
1218
- }, import_react44.default.createElement("button", {
1139
+ }, /* @__PURE__ */ import_react43.default.createElement("button", {
1219
1140
  ref,
1220
1141
  className: (0, import_clsx4.default)("fastboard-toolbar-btn", theme, { active }),
1221
1142
  onClick,
@@ -1227,9 +1148,9 @@ var Button = (0, import_react44.forwardRef)((props, ref) => {
1227
1148
  function renderToolTip(text, hotkey) {
1228
1149
  if (!(typeof hotkey === "string"))
1229
1150
  return text;
1230
- return import_react46.default.createElement("span", {
1151
+ return /* @__PURE__ */ import_react45.default.createElement("span", {
1231
1152
  className: "fastboard-toolbar-tooltip"
1232
- }, import_react46.default.createElement("span", null, text), import_react46.default.createElement("span", {
1153
+ }, /* @__PURE__ */ import_react45.default.createElement("span", null, text), /* @__PURE__ */ import_react45.default.createElement("span", {
1233
1154
  className: "fastboard-toolbar-hotkey"
1234
1155
  }, hotkey.toUpperCase()));
1235
1156
  }
@@ -1237,18 +1158,18 @@ function ClickerButton() {
1237
1158
  var _a;
1238
1159
  const app = useFastboardApp();
1239
1160
  const { t } = useTranslation();
1240
- const { theme, icons, writable, setAppliance, memberState } = (0, import_react46.useContext)(ToolbarContext);
1241
- const changeAppliance = (0, import_react46.useCallback)(() => setAppliance(import_white_web_sdk.ApplianceNames.clicker), [setAppliance]);
1161
+ const { theme, icons, writable, setAppliance, memberState } = (0, import_react45.useContext)(ToolbarContext);
1162
+ const changeAppliance = (0, import_react45.useCallback)(() => setAppliance(import_white_web_sdk.ApplianceNames.clicker), [setAppliance]);
1242
1163
  const shortcut = (_a = app.hotKeys) == null ? void 0 : _a.changeToClick;
1243
1164
  const appliance = memberState == null ? void 0 : memberState.currentApplianceName;
1244
1165
  const active = appliance === import_white_web_sdk.ApplianceNames.clicker;
1245
1166
  const disabled = !writable;
1246
- return import_react46.default.createElement(Button, {
1167
+ return /* @__PURE__ */ import_react45.default.createElement(Button, {
1247
1168
  content: renderToolTip(t("clicker"), shortcut),
1248
1169
  onClick: changeAppliance,
1249
1170
  active
1250
- }, import_react46.default.createElement(Icon, {
1251
- fallback: import_react46.default.createElement(Icons.Clicker, {
1171
+ }, /* @__PURE__ */ import_react45.default.createElement(Icon, {
1172
+ fallback: /* @__PURE__ */ import_react45.default.createElement(Icons.Clicker, {
1252
1173
  theme,
1253
1174
  active
1254
1175
  }),
@@ -1259,18 +1180,18 @@ function ClickerButton() {
1259
1180
  function SelectorButton() {
1260
1181
  const app = useFastboardApp();
1261
1182
  const { t } = useTranslation();
1262
- const { theme, icons, writable, setAppliance, memberState } = (0, import_react46.useContext)(ToolbarContext);
1263
- const changeAppliance = (0, import_react46.useCallback)(() => setAppliance(import_white_web_sdk.ApplianceNames.selector), [setAppliance]);
1183
+ const { theme, icons, writable, setAppliance, memberState } = (0, import_react45.useContext)(ToolbarContext);
1184
+ const changeAppliance = (0, import_react45.useCallback)(() => setAppliance(import_white_web_sdk.ApplianceNames.selector), [setAppliance]);
1264
1185
  const appliance = memberState == null ? void 0 : memberState.currentApplianceName;
1265
1186
  const active = appliance === import_white_web_sdk.ApplianceNames.selector;
1266
1187
  const disabled = !writable;
1267
1188
  const shortcut = (app.hotKeys || defaultHotKeys).changeToSelector;
1268
- return import_react46.default.createElement(Button, {
1189
+ return /* @__PURE__ */ import_react45.default.createElement(Button, {
1269
1190
  content: renderToolTip(t("selector"), shortcut),
1270
1191
  onClick: changeAppliance,
1271
1192
  active
1272
- }, import_react46.default.createElement(Icon, {
1273
- fallback: import_react46.default.createElement(Icons.Selector, {
1193
+ }, /* @__PURE__ */ import_react45.default.createElement(Icon, {
1194
+ fallback: /* @__PURE__ */ import_react45.default.createElement(Icons.Selector, {
1274
1195
  theme,
1275
1196
  active
1276
1197
  }),
@@ -1281,18 +1202,18 @@ function SelectorButton() {
1281
1202
  function EraserButton() {
1282
1203
  const app = useFastboardApp();
1283
1204
  const { t } = useTranslation();
1284
- const { theme, icons, writable, setAppliance, memberState } = (0, import_react46.useContext)(ToolbarContext);
1285
- const changeAppliance = (0, import_react46.useCallback)(() => setAppliance(import_white_web_sdk.ApplianceNames.eraser), [setAppliance]);
1205
+ const { theme, icons, writable, setAppliance, memberState } = (0, import_react45.useContext)(ToolbarContext);
1206
+ const changeAppliance = (0, import_react45.useCallback)(() => setAppliance(import_white_web_sdk.ApplianceNames.eraser), [setAppliance]);
1286
1207
  const appliance = memberState == null ? void 0 : memberState.currentApplianceName;
1287
1208
  const active = appliance === import_white_web_sdk.ApplianceNames.eraser;
1288
1209
  const disabled = !writable;
1289
1210
  const shortcut = ((app == null ? void 0 : app.hotKeys) || defaultHotKeys).changeToEraser;
1290
- return import_react46.default.createElement(Button, {
1211
+ return /* @__PURE__ */ import_react45.default.createElement(Button, {
1291
1212
  content: renderToolTip(t("eraser"), shortcut),
1292
1213
  onClick: changeAppliance,
1293
1214
  active
1294
- }, import_react46.default.createElement(Icon, {
1295
- fallback: import_react46.default.createElement(Icons.Eraser, {
1215
+ }, /* @__PURE__ */ import_react45.default.createElement(Icon, {
1216
+ fallback: /* @__PURE__ */ import_react45.default.createElement(Icons.Eraser, {
1296
1217
  theme,
1297
1218
  active
1298
1219
  }),
@@ -1302,13 +1223,13 @@ function EraserButton() {
1302
1223
  }
1303
1224
  function CleanButton() {
1304
1225
  const { t } = useTranslation();
1305
- const { theme, icons, writable, cleanCurrentScene } = (0, import_react46.useContext)(ToolbarContext);
1226
+ const { theme, icons, writable, cleanCurrentScene } = (0, import_react45.useContext)(ToolbarContext);
1306
1227
  const disabled = !writable;
1307
- return import_react46.default.createElement(Button, {
1228
+ return /* @__PURE__ */ import_react45.default.createElement(Button, {
1308
1229
  content: t("clean"),
1309
1230
  onClick: cleanCurrentScene
1310
- }, import_react46.default.createElement(Icon, {
1311
- fallback: import_react46.default.createElement(Icons.Clean, {
1231
+ }, /* @__PURE__ */ import_react45.default.createElement(Icon, {
1232
+ fallback: /* @__PURE__ */ import_react45.default.createElement(Icons.Clean, {
1312
1233
  theme
1313
1234
  }),
1314
1235
  src: disabled ? icons == null ? void 0 : icons.cleanIconDisable : icons == null ? void 0 : icons.cleanIcon,
@@ -1317,8 +1238,8 @@ function CleanButton() {
1317
1238
  }
1318
1239
 
1319
1240
  // src/components/Toolbar/components/AppsButton.tsx
1320
- var import_react47 = __toESM(require("@tippyjs/react"));
1321
- var import_react48 = __toESM(require("react"));
1241
+ var import_react46 = __toESM(require("@tippyjs/react"));
1242
+ var import_react47 = __toESM(require("react"));
1322
1243
 
1323
1244
  // src/components/Toolbar/components/assets/vscode.png
1324
1245
  var vscode_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAAAAXNSR0IArs4c6QAABnxJREFUWMPtWWlsVFUUPve+ZTY6HUoLpS1tEUrLVooKLgWVTQGVfRWhiUpAECGGEgOJShRj9I9EjSEQIMhSBIKBQoBgQCMEKEuo1LKV7rRl2pm201nf3Hv8MdNKO/NmBqWFGE7Oj8nkzb3f+8653zn3DEFEePyMwmNpT2D9D2CJnb1BpcWx/WKdTYoZ01f/SpKoE0kkvyKdehKL7jat++WapalZlOS4wS+aNGRiMp2QLHWTySODde5Ow/r8YpvDCZxRgj2HjCKEAqHdZJiYIk5KEYwa2tWwjhXVfn3iptujACIwhQLEZWYT0oqDUINExvcRJqeKsTraRbDyCiq/P3Wbcw4AiByYVwCMzRz1Dyz/5kQn0rHJ4tsDRG37nHvIKY+Im34v3XGuDDm2fuODhoiAAU/bPSz/Dnq8fFmmprMEQmH8q+M3t54t9TLOEH3OETkCB1ALCnJ+slzpLIFwetj6I8Uni+ugfVYQBB9TIZLFw7FTYDU7ldwDf14st0Dg5oiICIAMgaiGPmI5vWF2SQJ5KkYTFpPZ5vpwb+H12iYIRkgrWxDiZGEkKs8Rfzhv3n7FQgnJyeq+ZESsJKimYIXFsXzXlSqrXe0B3prqXJ2tgBgGpLzC8IvTdVsKGrwK83i8mwsaVuRXm+1K0OWKa5rf2XGp3NLSluCBzgGMBu26qcM1oogIQR3Cwvr8dO3P1xoZIgPCgDDEP8ptc/ZWnKvsyMf50obFOy/fa3KELCJkcKJp9+LscYMTfaypeRhYR240ImfY3u7ZXEsPVW0qqGetdB+7VvNB3lVri4txVHMEMm9E8racEUkxegTg4BOLoB4O1ursXoTQQJ49infjWfPy/Kp6u5J3vnTNvit2hxPVLUqn+WrG0LWTMrSS0Hbc1KjiEE4g5g+LkQW6/lStx8sChe90ie2Nantz1U2ueECQgApAKZAOqUzS46O+nZPVN9bQQQVUpSsSgZg5xGTS0dzjdXaXO3ABq5NDj77YWAPORqAiUBGoQNqQETrr2T5rJ6YbNB1X5qAKC8MG0Wfj+hk3T02MNmgYQjAnPDoBoxM483KmcKYwzhiCTitvmD5kw9TBgZh8sEJ4pE3zM4n6n2b0iTeqyinqTBjXD4Gi4kHG+sXq894dOevpJNUwqahD0OCGKtXpcdq8OSmpMVpVTRJkHteP64zTshL2L83O6G0MsZoK8X5/wJrIFDCXoNIdZJ2aNIEpiZu6Iw3TjISoPwgPwtb12uaZP565VduE5hLusnGE4M7xwDXrtF13iu85Q2F6KEEsKLPM23zhbpOLUYkTEevLuN3qa1CCGOe3zM4Ze8rzCi2qHUzkGq8G63hR7YJtF+/ZnAwIJwKnIicSWiq5zRxicZvLs/pYde7xGruHBUQaWAiPhK28CxVLdl5usbv8QUJAQjkVUJCwqcbotSKQEAHdfbVhys7SEos7IIjqFsBYR1jbzpSu3l/oVrztmSBABE7lcZmpv60Y+eWrCYIg+LvhYMiK6hyTd5QeLGqMMIbh28DP8os8jAVSKIli7oQBK8b2FyjJGa4zaYWVR+863YpaajY63O8frrxQ7fhkTLxOom0C8S9nENOzkgBIu9dHiI/W57333KrxaQL1F5mpA007ZiZH6WTVaCIwxrdcrJ+ys6TM6ob/eBK/mZW58PkU9PW6AEjIy+k9T6waPTottsOTL6V2Ozg/tZdRGwIZ53i5qmXClr+OFJlDXuMiuL5yxA1Hizf+elugZOXY/rmvpYdomu9Y3DP3lJZZXSEuXOB1U2SJaUMJISrSgYULoyO6VRdWN8qCkBEfFTYPamzKnL1lhTWO4BKEjCgewpWEAcMIJWqX3qJF0RHJaWaiKRJMANA7Sjq0oG92ahQCCZo3vr4UH1apjty668R9c1PeHGhiAB3KOSJy7t9YFVbnjd0MsrBterJJK2y9VH//67d95AhqNzKJduaQUhbId68nrhnVixDappX+e75/OhJU4smMNE3nDikpIevH9Y7RCx+fuMsY950pisB9oDrKANVLdPYA6aMsuStmpytf6BmrF5cdrnZ7FETgiAQA4b4oEmqUydw0MWeQHG8Qum6ku2BYTA+d+Na+ima7AzgIiIgEAIBSk4YszJAWDZRjtF0+pPSPTytapu0qMVuaJYEkpA/rqSc5GeL8DNmkoY9y0gwAN+tdn542W6HbvEGG2WmSQXoMBuBP/lx5Auuxs78BCY9M0wbXBY0AAAAASUVORK5CYII=";
@@ -1331,21 +1252,21 @@ var countdown_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyC
1331
1252
 
1332
1253
  // src/components/Toolbar/components/AppsButton.tsx
1333
1254
  function AppsButton({ content, onClick }) {
1334
- const { theme, icons, writable } = (0, import_react48.useContext)(ToolbarContext);
1255
+ const { theme, icons, writable } = (0, import_react47.useContext)(ToolbarContext);
1335
1256
  const disabled = !writable;
1336
- const button = import_react48.default.createElement(Button, {
1257
+ const button = /* @__PURE__ */ import_react47.default.createElement(Button, {
1337
1258
  content: "Apps",
1338
1259
  onClick
1339
- }, import_react48.default.createElement(Icon, {
1340
- fallback: import_react48.default.createElement(Icons.Apps, {
1260
+ }, /* @__PURE__ */ import_react47.default.createElement(Icon, {
1261
+ fallback: /* @__PURE__ */ import_react47.default.createElement(Icons.Apps, {
1341
1262
  theme
1342
1263
  }),
1343
1264
  src: disabled ? icons == null ? void 0 : icons.appsIconDisable : icons == null ? void 0 : icons.appsIcon,
1344
1265
  alt: "[apps]"
1345
1266
  }));
1346
- return content === false ? button : import_react48.default.createElement("span", {
1267
+ return content === false ? button : /* @__PURE__ */ import_react47.default.createElement("span", {
1347
1268
  className: "fastboard-toolbar-btn-interactive"
1348
- }, import_react48.default.createElement(import_react47.default, {
1269
+ }, /* @__PURE__ */ import_react47.default.createElement(import_react46.default, {
1349
1270
  className: "fastboard-tip",
1350
1271
  content: renderAppsButtonContent(content),
1351
1272
  theme,
@@ -1357,25 +1278,25 @@ function AppsButton({ content, onClick }) {
1357
1278
  }, button));
1358
1279
  }
1359
1280
  function renderAppsButtonContent(content) {
1360
- return import_react48.default.createElement("div", {
1281
+ return /* @__PURE__ */ import_react47.default.createElement("div", {
1361
1282
  className: "fastboard-toolbar-panel apps"
1362
- }, import_react48.default.createElement("div", {
1283
+ }, /* @__PURE__ */ import_react47.default.createElement("div", {
1363
1284
  className: "fastboard-toolbar-apps"
1364
- }, content || import_react48.default.createElement(DefaultApps, null)));
1285
+ }, content || /* @__PURE__ */ import_react47.default.createElement(DefaultApps, null)));
1365
1286
  }
1366
1287
  function DefaultApps() {
1367
1288
  const app = useFastboardApp();
1368
- return import_react48.default.createElement(import_react48.default.Fragment, null, import_react48.default.createElement(AppIcon, {
1289
+ return /* @__PURE__ */ import_react47.default.createElement(import_react47.default.Fragment, null, /* @__PURE__ */ import_react47.default.createElement(AppIcon, {
1369
1290
  title: "Code Editor",
1370
1291
  src: vscode_default,
1371
1292
  alt: "[code editor]",
1372
1293
  onClick: app == null ? void 0 : app.insertCodeEditor.bind(app)
1373
- }), import_react48.default.createElement(AppIcon, {
1294
+ }), /* @__PURE__ */ import_react47.default.createElement(AppIcon, {
1374
1295
  title: "GeoGebra",
1375
1296
  src: geogebra_default,
1376
1297
  alt: "[geogebra]",
1377
1298
  onClick: app == null ? void 0 : app.insertGeoGebra.bind(app)
1378
- }), import_react48.default.createElement(AppIcon, {
1299
+ }), /* @__PURE__ */ import_react47.default.createElement(AppIcon, {
1379
1300
  title: "Countdown",
1380
1301
  src: countdown_default,
1381
1302
  alt: "[countdown]",
@@ -1383,29 +1304,29 @@ function DefaultApps() {
1383
1304
  }));
1384
1305
  }
1385
1306
  function AppIcon({ title, src, alt, onClick }) {
1386
- return import_react48.default.createElement("span", {
1307
+ return /* @__PURE__ */ import_react47.default.createElement("span", {
1387
1308
  className: "fastboard-toolbar-app-icon"
1388
- }, import_react48.default.createElement(Button, {
1309
+ }, /* @__PURE__ */ import_react47.default.createElement(Button, {
1389
1310
  placement: "top",
1390
1311
  content: title,
1391
1312
  onClick
1392
- }, import_react48.default.createElement("img", {
1313
+ }, /* @__PURE__ */ import_react47.default.createElement("img", {
1393
1314
  src,
1394
1315
  alt,
1395
1316
  title
1396
- })), import_react48.default.createElement("span", {
1317
+ })), /* @__PURE__ */ import_react47.default.createElement("span", {
1397
1318
  className: "fastboard-toolbar-app-icon-text"
1398
1319
  }, title));
1399
1320
  }
1400
1321
 
1401
1322
  // src/components/Toolbar/components/PencilButton.tsx
1402
- var import_react52 = __toESM(require("@tippyjs/react"));
1403
- var import_react53 = __toESM(require("react"));
1323
+ var import_react51 = __toESM(require("@tippyjs/react"));
1324
+ var import_react52 = __toESM(require("react"));
1404
1325
  var import_white_web_sdk2 = require("white-web-sdk");
1405
1326
 
1406
1327
  // src/components/Toolbar/components/ColorBox.tsx
1407
1328
  var import_clsx5 = __toESM(require("clsx"));
1408
- var import_react49 = __toESM(require("react"));
1329
+ var import_react48 = __toESM(require("react"));
1409
1330
  var colors = {
1410
1331
  "#E02020": [224, 32, 32],
1411
1332
  "#F7B500": [247, 181, 0],
@@ -1418,20 +1339,20 @@ var colors = {
1418
1339
  };
1419
1340
  var colorKeys = Object.keys(colors);
1420
1341
  function ColorBox() {
1421
- const { theme, memberState, setStrokeColor, writable } = (0, import_react49.useContext)(ToolbarContext);
1342
+ const { theme, memberState, setStrokeColor, writable } = (0, import_react48.useContext)(ToolbarContext);
1422
1343
  const strokeColor = memberState == null ? void 0 : memberState.strokeColor;
1423
1344
  const disabled = !writable;
1424
- return import_react49.default.createElement("div", {
1345
+ return /* @__PURE__ */ import_react48.default.createElement("div", {
1425
1346
  className: (0, import_clsx5.default)("fastboard-toolbar-color-box", theme)
1426
- }, colorKeys.map((key) => import_react49.default.createElement("div", {
1347
+ }, colorKeys.map((key) => /* @__PURE__ */ import_react48.default.createElement("div", {
1427
1348
  key,
1428
1349
  className: (0, import_clsx5.default)("fastboard-toolbar-color-item", theme),
1429
1350
  onClick: () => setStrokeColor(colors[key])
1430
- }, import_react49.default.createElement("div", {
1351
+ }, /* @__PURE__ */ import_react48.default.createElement("div", {
1431
1352
  className: (0, import_clsx5.default)("fastboard-toolbar-color-border", theme, {
1432
1353
  active: strokeColor && isEqualArray(strokeColor, colors[key])
1433
1354
  })
1434
- }, import_react49.default.createElement("button", {
1355
+ }, /* @__PURE__ */ import_react48.default.createElement("button", {
1435
1356
  className: (0, import_clsx5.default)("fastboard-toolbar-color-btn"),
1436
1357
  style: { background: key },
1437
1358
  disabled,
@@ -1444,10 +1365,10 @@ function ColorBox() {
1444
1365
 
1445
1366
  // src/components/Toolbar/components/CutLine.tsx
1446
1367
  var import_clsx6 = __toESM(require("clsx"));
1447
- var import_react50 = __toESM(require("react"));
1368
+ var import_react49 = __toESM(require("react"));
1448
1369
  function CutLine() {
1449
- const { theme } = (0, import_react50.useContext)(ToolbarContext);
1450
- return import_react50.default.createElement("span", {
1370
+ const { theme } = (0, import_react49.useContext)(ToolbarContext);
1371
+ return /* @__PURE__ */ import_react49.default.createElement("span", {
1451
1372
  className: (0, import_clsx6.default)(`${name4}-cut-line`, theme)
1452
1373
  });
1453
1374
  }
@@ -1455,12 +1376,12 @@ function CutLine() {
1455
1376
  // src/components/Toolbar/components/Slider.tsx
1456
1377
  var import_clsx7 = __toESM(require("clsx"));
1457
1378
  var import_rc_slider = __toESM(require("rc-slider"));
1458
- var import_react51 = __toESM(require("react"));
1379
+ var import_react50 = __toESM(require("react"));
1459
1380
  function Slider() {
1460
- const { theme, writable, memberState, setStrokeWidth } = (0, import_react51.useContext)(ToolbarContext);
1381
+ const { theme, writable, memberState, setStrokeWidth } = (0, import_react50.useContext)(ToolbarContext);
1461
1382
  const { activeColor } = themes[theme];
1462
1383
  const strokeWidth = (memberState == null ? void 0 : memberState.strokeWidth) || 0;
1463
- return import_react51.default.createElement(import_rc_slider.default, {
1384
+ return /* @__PURE__ */ import_react50.default.createElement(import_rc_slider.default, {
1464
1385
  disabled: !writable,
1465
1386
  className: (0, import_clsx7.default)("fastboard-toolbar-slider", theme),
1466
1387
  trackStyle: { background: activeColor },
@@ -1476,17 +1397,17 @@ function Slider() {
1476
1397
  function PencilButton() {
1477
1398
  const app = useFastboardApp();
1478
1399
  const { t } = useTranslation();
1479
- const { theme, icons, writable, setAppliance, memberState } = (0, import_react53.useContext)(ToolbarContext);
1480
- const changeAppliance = (0, import_react53.useCallback)(() => {
1400
+ const { theme, icons, writable, setAppliance, memberState } = (0, import_react52.useContext)(ToolbarContext);
1401
+ const changeAppliance = (0, import_react52.useCallback)(() => {
1481
1402
  setAppliance(import_white_web_sdk2.ApplianceNames.pencil);
1482
1403
  }, [setAppliance]);
1483
1404
  const appliance = memberState == null ? void 0 : memberState.currentApplianceName;
1484
1405
  const active = appliance === import_white_web_sdk2.ApplianceNames.pencil;
1485
1406
  const disabled = !writable;
1486
1407
  const shortcut = ((app == null ? void 0 : app.hotKeys) || defaultHotKeys).changeToPencil;
1487
- return import_react53.default.createElement("span", {
1408
+ return /* @__PURE__ */ import_react52.default.createElement("span", {
1488
1409
  className: "fastboard-toolbar-btn-interactive"
1489
- }, import_react53.default.createElement(import_react52.default, {
1410
+ }, /* @__PURE__ */ import_react52.default.createElement(import_react51.default, {
1490
1411
  className: "fastboard-tip",
1491
1412
  content: renderPencilButtonContent(),
1492
1413
  theme,
@@ -1495,30 +1416,30 @@ function PencilButton() {
1495
1416
  offset: RightOffset,
1496
1417
  arrow: false,
1497
1418
  interactive: true
1498
- }, import_react53.default.createElement(Button, {
1419
+ }, /* @__PURE__ */ import_react52.default.createElement(Button, {
1499
1420
  content: renderToolTip(t("pencil"), shortcut),
1500
1421
  active,
1501
1422
  onClick: changeAppliance
1502
- }, import_react53.default.createElement(Icon, {
1503
- fallback: import_react53.default.createElement(Icons.Pencil, {
1423
+ }, /* @__PURE__ */ import_react52.default.createElement(Icon, {
1424
+ fallback: /* @__PURE__ */ import_react52.default.createElement(Icons.Pencil, {
1504
1425
  theme,
1505
1426
  active
1506
1427
  }),
1507
1428
  src: disabled ? icons == null ? void 0 : icons.pencilIconDisable : icons == null ? void 0 : icons.pencilIcon,
1508
1429
  alt: "[pencil]"
1509
- }), import_react53.default.createElement("span", {
1430
+ }), /* @__PURE__ */ import_react52.default.createElement("span", {
1510
1431
  className: "fastboard-toolbar-triangle"
1511
1432
  }))));
1512
1433
  }
1513
1434
  function renderPencilButtonContent() {
1514
- return import_react53.default.createElement("div", {
1435
+ return /* @__PURE__ */ import_react52.default.createElement("div", {
1515
1436
  className: "fastboard-toolbar-panel pencil"
1516
- }, import_react53.default.createElement(Slider, null), import_react53.default.createElement(CutLine, null), import_react53.default.createElement(ColorBox, null));
1437
+ }, /* @__PURE__ */ import_react52.default.createElement(Slider, null), /* @__PURE__ */ import_react52.default.createElement(CutLine, null), /* @__PURE__ */ import_react52.default.createElement(ColorBox, null));
1517
1438
  }
1518
1439
 
1519
1440
  // src/components/Toolbar/components/ShapesButton.tsx
1520
- var import_react54 = __toESM(require("@tippyjs/react"));
1521
- var import_react55 = __toESM(require("react"));
1441
+ var import_react53 = __toESM(require("@tippyjs/react"));
1442
+ var import_react54 = __toESM(require("react"));
1522
1443
  var import_white_web_sdk4 = require("white-web-sdk");
1523
1444
 
1524
1445
  // src/components/Toolbar/const.ts
@@ -1554,15 +1475,15 @@ var MinHeight = ItemHeight * 2 - 4;
1554
1475
  var ShapeTypes = /* @__PURE__ */ new Set([...ApplianceShapes, ...Shapes]);
1555
1476
  function ShapesButton() {
1556
1477
  const { t } = useTranslation();
1557
- const { theme, memberState } = (0, import_react55.useContext)(ToolbarContext);
1478
+ const { theme, memberState } = (0, import_react54.useContext)(ToolbarContext);
1558
1479
  const appliance = memberState == null ? void 0 : memberState.currentApplianceName;
1559
1480
  const shape = memberState == null ? void 0 : memberState.shapeType;
1560
1481
  const key = appliance === import_white_web_sdk4.ApplianceNames.shape ? shape : appliance;
1561
1482
  const active = ShapeTypes.has(key);
1562
1483
  const CurrentIcon = ShapesMap[key] || Icons.Rectangle;
1563
- return import_react55.default.createElement("span", {
1484
+ return /* @__PURE__ */ import_react54.default.createElement("span", {
1564
1485
  className: "fastboard-toolbar-btn-interactive"
1565
- }, import_react55.default.createElement(import_react54.default, {
1486
+ }, /* @__PURE__ */ import_react54.default.createElement(import_react53.default, {
1566
1487
  className: "fastboard-tip",
1567
1488
  content: renderShapesButtonContent(),
1568
1489
  theme,
@@ -1571,31 +1492,31 @@ function ShapesButton() {
1571
1492
  offset: RightOffset,
1572
1493
  arrow: false,
1573
1494
  interactive: true
1574
- }, import_react55.default.createElement(Button, {
1495
+ }, /* @__PURE__ */ import_react54.default.createElement(Button, {
1575
1496
  content: t("shape"),
1576
1497
  active
1577
- }, import_react55.default.createElement(CurrentIcon, {
1498
+ }, /* @__PURE__ */ import_react54.default.createElement(CurrentIcon, {
1578
1499
  theme,
1579
1500
  active
1580
- }), import_react55.default.createElement("span", {
1501
+ }), /* @__PURE__ */ import_react54.default.createElement("span", {
1581
1502
  className: "fastboard-toolbar-triangle"
1582
1503
  }))));
1583
1504
  }
1584
1505
  function renderShapesButtonContent() {
1585
- return import_react55.default.createElement("div", {
1506
+ return /* @__PURE__ */ import_react54.default.createElement("div", {
1586
1507
  className: "fastboard-toolbar-panel shapes"
1587
- }, import_react55.default.createElement(ShapesBox, null), import_react55.default.createElement(CutLine, null), import_react55.default.createElement(Slider, null), import_react55.default.createElement(CutLine, null), import_react55.default.createElement(ColorBox, null));
1508
+ }, /* @__PURE__ */ import_react54.default.createElement(ShapesBox, null), /* @__PURE__ */ import_react54.default.createElement(CutLine, null), /* @__PURE__ */ import_react54.default.createElement(Slider, null), /* @__PURE__ */ import_react54.default.createElement(CutLine, null), /* @__PURE__ */ import_react54.default.createElement(ColorBox, null));
1588
1509
  }
1589
1510
  function ShapesBox() {
1590
1511
  const { t } = useTranslation();
1591
- return import_react55.default.createElement("div", {
1512
+ return /* @__PURE__ */ import_react54.default.createElement("div", {
1592
1513
  className: "fastboard-toolbar-shapes"
1593
- }, ApplianceShapes.map((Appliance) => import_react55.default.createElement(ApplianceShapeButton, {
1514
+ }, ApplianceShapes.map((Appliance) => /* @__PURE__ */ import_react54.default.createElement(ApplianceShapeButton, {
1594
1515
  key: Appliance,
1595
1516
  content: t(Appliance),
1596
1517
  Appliance,
1597
1518
  Icon: ShapesMap[Appliance]
1598
- })), Shapes.map((shape) => import_react55.default.createElement(ShapeShapeButton, {
1519
+ })), Shapes.map((shape) => /* @__PURE__ */ import_react54.default.createElement(ShapeShapeButton, {
1599
1520
  key: shape,
1600
1521
  content: t(shape),
1601
1522
  shape,
@@ -1603,53 +1524,53 @@ function ShapesBox() {
1603
1524
  })));
1604
1525
  }
1605
1526
  function ApplianceShapeButton({ content, Appliance, Icon: Icon2 }) {
1606
- const { theme, writable, setAppliance, memberState } = (0, import_react55.useContext)(ToolbarContext);
1527
+ const { theme, writable, setAppliance, memberState } = (0, import_react54.useContext)(ToolbarContext);
1607
1528
  const current = memberState == null ? void 0 : memberState.currentApplianceName;
1608
1529
  const disabled = !writable;
1609
- return import_react55.default.createElement(Button, {
1530
+ return /* @__PURE__ */ import_react54.default.createElement(Button, {
1610
1531
  content,
1611
1532
  disabled,
1612
1533
  placement: "top",
1613
1534
  onClick: () => setAppliance(Appliance)
1614
- }, import_react55.default.createElement(Icon2, {
1535
+ }, /* @__PURE__ */ import_react54.default.createElement(Icon2, {
1615
1536
  theme,
1616
1537
  active: current === Appliance
1617
1538
  }));
1618
1539
  }
1619
1540
  function ShapeShapeButton({ content, shape, Icon: Icon2 }) {
1620
- const { theme, writable, setAppliance, memberState } = (0, import_react55.useContext)(ToolbarContext);
1541
+ const { theme, writable, setAppliance, memberState } = (0, import_react54.useContext)(ToolbarContext);
1621
1542
  const appliance = memberState == null ? void 0 : memberState.currentApplianceName;
1622
1543
  const current = appliance === import_white_web_sdk4.ApplianceNames.shape && (memberState == null ? void 0 : memberState.shapeType);
1623
1544
  const disabled = !writable;
1624
- return import_react55.default.createElement(Button, {
1545
+ return /* @__PURE__ */ import_react54.default.createElement(Button, {
1625
1546
  content,
1626
1547
  disabled,
1627
1548
  placement: "top",
1628
1549
  onClick: () => setAppliance(import_white_web_sdk4.ApplianceNames.shape, shape)
1629
- }, import_react55.default.createElement(Icon2, {
1550
+ }, /* @__PURE__ */ import_react54.default.createElement(Icon2, {
1630
1551
  theme,
1631
1552
  active: current === shape
1632
1553
  }));
1633
1554
  }
1634
1555
 
1635
1556
  // src/components/Toolbar/components/TextButton.tsx
1636
- var import_react56 = __toESM(require("@tippyjs/react"));
1637
- var import_react57 = __toESM(require("react"));
1557
+ var import_react55 = __toESM(require("@tippyjs/react"));
1558
+ var import_react56 = __toESM(require("react"));
1638
1559
  var import_white_web_sdk5 = require("white-web-sdk");
1639
1560
  function TextButton() {
1640
1561
  const app = useFastboardApp();
1641
1562
  const { t } = useTranslation();
1642
- const { theme, icons, writable, setAppliance, memberState } = (0, import_react57.useContext)(ToolbarContext);
1643
- const changeAppliance = (0, import_react57.useCallback)(() => {
1563
+ const { theme, icons, writable, setAppliance, memberState } = (0, import_react56.useContext)(ToolbarContext);
1564
+ const changeAppliance = (0, import_react56.useCallback)(() => {
1644
1565
  setAppliance(import_white_web_sdk5.ApplianceNames.text);
1645
1566
  }, [setAppliance]);
1646
1567
  const appliance = memberState == null ? void 0 : memberState.currentApplianceName;
1647
1568
  const active = appliance === import_white_web_sdk5.ApplianceNames.text;
1648
1569
  const disabled = !writable;
1649
1570
  const shortcut = ((app == null ? void 0 : app.hotKeys) || defaultHotKeys).changeToText;
1650
- return import_react57.default.createElement("span", {
1571
+ return /* @__PURE__ */ import_react56.default.createElement("span", {
1651
1572
  className: "fastboard-toolbar-btn-interactive"
1652
- }, import_react57.default.createElement(import_react56.default, {
1573
+ }, /* @__PURE__ */ import_react56.default.createElement(import_react55.default, {
1653
1574
  className: "fastboard-tip",
1654
1575
  content: renderTextButtonContent(),
1655
1576
  theme,
@@ -1658,53 +1579,53 @@ function TextButton() {
1658
1579
  offset: RightOffset,
1659
1580
  arrow: false,
1660
1581
  interactive: true
1661
- }, import_react57.default.createElement(Button, {
1582
+ }, /* @__PURE__ */ import_react56.default.createElement(Button, {
1662
1583
  content: renderToolTip(t("text"), shortcut),
1663
1584
  active,
1664
1585
  onClick: changeAppliance
1665
- }, import_react57.default.createElement(Icon, {
1666
- fallback: import_react57.default.createElement(Icons.Text, {
1586
+ }, /* @__PURE__ */ import_react56.default.createElement(Icon, {
1587
+ fallback: /* @__PURE__ */ import_react56.default.createElement(Icons.Text, {
1667
1588
  theme,
1668
1589
  active
1669
1590
  }),
1670
1591
  src: disabled ? icons == null ? void 0 : icons.textIconDisable : icons == null ? void 0 : icons.textIcon,
1671
1592
  alt: "[text]"
1672
- }), import_react57.default.createElement("span", {
1593
+ }), /* @__PURE__ */ import_react56.default.createElement("span", {
1673
1594
  className: "fastboard-toolbar-triangle"
1674
1595
  }))));
1675
1596
  }
1676
1597
  function renderTextButtonContent() {
1677
- return import_react57.default.createElement("div", {
1598
+ return /* @__PURE__ */ import_react56.default.createElement("div", {
1678
1599
  className: "fastboard-toolbar-panel text"
1679
- }, import_react57.default.createElement(ColorBox, null));
1600
+ }, /* @__PURE__ */ import_react56.default.createElement(ColorBox, null));
1680
1601
  }
1681
1602
 
1682
1603
  // src/components/Toolbar/components/UpDownButtons.tsx
1683
- var import_react58 = __toESM(require("react"));
1604
+ var import_react57 = __toESM(require("react"));
1684
1605
  function UpButton({ disabled, scrollTo }) {
1685
- const { theme, icons } = (0, import_react58.useContext)(ToolbarContext);
1686
- const scrollUp = (0, import_react58.useCallback)(() => scrollTo(-ItemHeight), [scrollTo]);
1687
- return import_react58.default.createElement(import_react58.default.Fragment, null, import_react58.default.createElement(Button, {
1606
+ const { theme, icons } = (0, import_react57.useContext)(ToolbarContext);
1607
+ const scrollUp = (0, import_react57.useCallback)(() => scrollTo(-ItemHeight), [scrollTo]);
1608
+ return /* @__PURE__ */ import_react57.default.createElement(import_react57.default.Fragment, null, /* @__PURE__ */ import_react57.default.createElement(Button, {
1688
1609
  content: "Up",
1689
1610
  disabled,
1690
1611
  onClick: scrollUp
1691
- }, import_react58.default.createElement(Icon, {
1692
- fallback: import_react58.default.createElement(Icons.Up, {
1612
+ }, /* @__PURE__ */ import_react57.default.createElement(Icon, {
1613
+ fallback: /* @__PURE__ */ import_react57.default.createElement(Icons.Up, {
1693
1614
  theme
1694
1615
  }),
1695
1616
  src: disabled ? icons == null ? void 0 : icons.upIconDisable : icons == null ? void 0 : icons.upIcon,
1696
1617
  alt: "[up]"
1697
- })), import_react58.default.createElement(CutLine, null));
1618
+ })), /* @__PURE__ */ import_react57.default.createElement(CutLine, null));
1698
1619
  }
1699
1620
  function DownButton({ disabled, scrollTo }) {
1700
- const { theme, icons } = (0, import_react58.useContext)(ToolbarContext);
1701
- const scrollDown = (0, import_react58.useCallback)(() => scrollTo(ItemHeight), [scrollTo]);
1702
- return import_react58.default.createElement(import_react58.default.Fragment, null, import_react58.default.createElement(CutLine, null), import_react58.default.createElement(Button, {
1621
+ const { theme, icons } = (0, import_react57.useContext)(ToolbarContext);
1622
+ const scrollDown = (0, import_react57.useCallback)(() => scrollTo(ItemHeight), [scrollTo]);
1623
+ return /* @__PURE__ */ import_react57.default.createElement(import_react57.default.Fragment, null, /* @__PURE__ */ import_react57.default.createElement(CutLine, null), /* @__PURE__ */ import_react57.default.createElement(Button, {
1703
1624
  content: "Down",
1704
1625
  disabled,
1705
1626
  onClick: scrollDown
1706
- }, import_react58.default.createElement(Icon, {
1707
- fallback: import_react58.default.createElement(Icons.Down, {
1627
+ }, /* @__PURE__ */ import_react57.default.createElement(Icon, {
1628
+ fallback: /* @__PURE__ */ import_react57.default.createElement(Icons.Down, {
1708
1629
  theme
1709
1630
  }),
1710
1631
  src: disabled ? icons == null ? void 0 : icons.downIconDisable : icons == null ? void 0 : icons.downIcon,
@@ -1712,25 +1633,30 @@ function DownButton({ disabled, scrollTo }) {
1712
1633
  })));
1713
1634
  }
1714
1635
 
1636
+ // src/components/Toolbar/components/assets/collapsed.png
1637
+ var collapsed_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAB8CAYAAAAMw2JFAAAAAXNSR0IArs4c6QAAA49JREFUeF7tnLFv00AUh5/TFVYkxIDEnKFjJ/gb2CIqpUPagYXNEV2LRGk7tAiRSA0bWcC0QzowwQKuVDnCLE2KTZCMSNLkHCLalCpBkdFVMTKh8TXO+c4S16XDSb0vv/vyfE3fqwQR+ZIA4AoAdADgJ08mSVXVV9ls9nE+nzcBAAFAnweQ1Gg06gihrmEYubm5OeX4+LgBAD9Yw0iO49S63S7U6/VYq9UyCoXC2tLS0kcAwEA9VkBnIO5m7XYbJwTVanVLluWcruvfAOA7ADhhA/0Fgjfr9/tweHgYs20baZq2sbCw8HaQTqgy/wPivvKTkxN8XFPNZvMdC5lHgmAgx3EAISQhhHqGYWyGKbMviJsOC5kvBOIjcxUAWjRkHgtkSGZb07R1WjKPDeIj82cAaAatzIFBhmU2TTOXTCZfBq3ME4HQlJkKCA2ZqYJMIjN1kKAyhwYyrsyhgpwns6IoyysrK/rgQfrnqc4ExCtzrVb7tbe39yCVSr0GAFyZz2CYguANT09PwbIsaWdn5146nX4zuO+wB8EwnU5HqlQqdiKRuHNwcFDC1Zh5Iu4xWZYVU1V1eXZ29jlOhRvI0dGRVC6XP8zMzNwFgK/cQHq9HpTLZXt6evo2AFS4geDbX6lUisXj8VsA8IkbCHZlf39/Kh6P3xQg7jtHJDL826JIRCRC+gRBOCIcEY6QEhCOkBISdUQ4IhwhJSAcISUk6kjojjxaXbt0Py3jP1DCtes3ruLvVetLnenRYIgnT7OX3Y25gLgQ3gSYg3ghuIEMQ3ABOQ+COcgoCKYgfhD/Jwh+1ZE4GrdKRkJWPxhulTUSBe28ZLglMgzDHcR9N3G/BpDuHH7r4qoY+lUx6PGIoxFHQ3JHOCIcEY6QEhCOkBISdUQ4IhwhJSAcISUk6ohwxM+RyLR/RaYhLjItgpFomoxEG2kkGmvxRBPXVmPPWIypKMpD5s3X3kEh0zSfJZPJF6NmK0JrI3VHpxBCaiaTWc/n877TJtRBPMNkdrFY3Jifn8ed3njUzneYjCqIZ7xue3FxMadpGh6vu9BEEhUQr4yFQmE1yMDhRCDjyEi6JAUGGVdG6iBBZaQK4pVRluVNXdfZjsfRkHGiRGjKGBjEI+P7TCazQaqMpI1I635jtmNVRtJGpPVRg8fbtGW8EAiL6VUiyGA4vUd6TJN+0KTr0u7u7hYLGUmg0fkHBiRSVuu/AWpfZNft9vFDAAAAAElFTkSuQmCC";
1638
+
1715
1639
  // src/components/Toolbar/Content.tsx
1716
- var Content = import_react59.default.memo(() => {
1717
- const ref = (0, import_react59.useRef)(null);
1718
- const [scrollTop, setScrollTop] = (0, import_react59.useState)(0);
1719
- const [parentHeight, setParentHeight] = (0, import_react59.useState)(0);
1640
+ function Content({ onCollapse }) {
1641
+ const { theme, icons, writable } = (0, import_react58.useContext)(ToolbarContext);
1642
+ const ref = (0, import_react58.useRef)(null);
1643
+ const [scrollTop, setScrollTop] = (0, import_react58.useState)(0);
1644
+ const [parentHeight, setParentHeight] = (0, import_react58.useState)(0);
1645
+ const disabled = !writable;
1720
1646
  const needScroll = parentHeight < ItemHeight * ItemsCount + 48;
1721
1647
  const sectionHeight = clamp(parentHeight - 48 * (needScroll ? 3 : 1), MinHeight, MaxHeight);
1722
1648
  const scrollBuffer = Math.max(parentHeight - sectionHeight - 1, 0);
1723
1649
  const disableScrollUp = scrollTop === 0;
1724
1650
  const disableScrollDown = scrollTop === scrollBuffer;
1725
- const scrollTo = (0, import_react59.useCallback)((height) => {
1651
+ const scrollTo = (0, import_react58.useCallback)((height) => {
1726
1652
  setScrollTop(clamp(scrollTop + height, 0, scrollBuffer));
1727
1653
  }, [scrollBuffer, scrollTop]);
1728
- (0, import_react59.useEffect)(() => {
1654
+ (0, import_react58.useEffect)(() => {
1729
1655
  if (ref.current) {
1730
1656
  ref.current.scrollTop = scrollTop;
1731
1657
  }
1732
1658
  }, [scrollTop]);
1733
- (0, import_react59.useEffect)(() => {
1659
+ (0, import_react58.useEffect)(() => {
1734
1660
  var _a, _b;
1735
1661
  const container = (_b = (_a = ref.current) == null ? void 0 : _a.parentElement) == null ? void 0 : _b.parentElement;
1736
1662
  if (container) {
@@ -1743,95 +1669,82 @@ var Content = import_react59.default.memo(() => {
1743
1669
  return () => resizeObserver.disconnect();
1744
1670
  }
1745
1671
  }, []);
1746
- return import_react59.default.createElement(import_react59.default.Fragment, null, needScroll && import_react59.default.createElement(UpButton, {
1672
+ return /* @__PURE__ */ import_react58.default.createElement(import_react58.default.Fragment, null, needScroll && /* @__PURE__ */ import_react58.default.createElement(UpButton, {
1747
1673
  scrollTo,
1748
1674
  disabled: disableScrollUp
1749
- }), import_react59.default.createElement("div", {
1675
+ }), /* @__PURE__ */ import_react58.default.createElement("div", {
1750
1676
  ref,
1751
1677
  className: (0, import_clsx8.default)(`${name4}-section`),
1752
1678
  style: {
1753
1679
  height: `${sectionHeight}px`,
1754
1680
  overflow: needScroll ? "hidden" : "visible"
1755
1681
  }
1756
- }, import_react59.default.createElement(ClickerButton, null), import_react59.default.createElement(SelectorButton, null), import_react59.default.createElement(PencilButton, null), import_react59.default.createElement(TextButton, null), import_react59.default.createElement(ShapesButton, null), import_react59.default.createElement(EraserButton, null), import_react59.default.createElement(CleanButton, null), import_react59.default.createElement(AppsButton, null)), needScroll && import_react59.default.createElement(DownButton, {
1682
+ }, /* @__PURE__ */ import_react58.default.createElement(ClickerButton, null), /* @__PURE__ */ import_react58.default.createElement(SelectorButton, null), /* @__PURE__ */ import_react58.default.createElement(PencilButton, null), /* @__PURE__ */ import_react58.default.createElement(TextButton, null), /* @__PURE__ */ import_react58.default.createElement(ShapesButton, null), /* @__PURE__ */ import_react58.default.createElement(EraserButton, null), /* @__PURE__ */ import_react58.default.createElement(CleanButton, null), /* @__PURE__ */ import_react58.default.createElement(AppsButton, null)), needScroll && /* @__PURE__ */ import_react58.default.createElement(DownButton, {
1757
1683
  scrollTo,
1758
1684
  disabled: disableScrollDown
1759
- }));
1760
- });
1685
+ }), /* @__PURE__ */ import_react58.default.createElement("div", {
1686
+ className: (0, import_clsx8.default)("fastboard-toolbar-mask", theme),
1687
+ onClick: onCollapse
1688
+ }, /* @__PURE__ */ import_react58.default.createElement(Icon, {
1689
+ fallback: /* @__PURE__ */ import_react58.default.createElement("img", {
1690
+ draggable: false,
1691
+ className: (0, import_clsx8.default)(`${name4}-mask-btn`, theme),
1692
+ src: collapsed_default
1693
+ }),
1694
+ src: disabled ? icons == null ? void 0 : icons.expandIconDisable : icons == null ? void 0 : icons.expandIcon
1695
+ })));
1696
+ }
1761
1697
 
1762
1698
  // src/components/Toolbar/Toolbar.tsx
1763
- var ToolbarContext = (0, import_react60.createContext)(__spreadValues({
1699
+ var ToolbarContext = (0, import_react59.createContext)(__spreadValues({
1764
1700
  theme: "light"
1765
1701
  }, EmptyToolbarHook));
1766
1702
  var name4 = "fastboard-toolbar";
1767
- var Toolbar = ({ theme, icons }) => {
1703
+ function Toolbar({ theme, icons }) {
1768
1704
  theme = useTheme(theme);
1769
1705
  const hook = useToolbar();
1770
- const [expanded, setExpanded] = (0, import_react60.useState)(true);
1771
- const [toolbar, toolbarRef] = (0, import_react60.useState)(null);
1772
- const [onHover, setOnHover] = (0, import_react60.useState)(false);
1773
- const [delayedOnHover, setDelayedOnHover] = (0, import_react60.useState)(false);
1774
- const [pointEvents, setPointEvents] = (0, import_react60.useState)(true);
1706
+ const [expanded, setExpanded] = (0, import_react59.useState)(true);
1707
+ const [pointerEvents, setPointerEvents] = (0, import_react59.useState)("auto");
1775
1708
  const disabled = !hook.writable;
1776
- const toggle = (0, import_react60.useCallback)(() => {
1777
- setExpanded((e) => !e);
1778
- }, []);
1779
- (0, import_react60.useEffect)(() => {
1780
- const timer = setTimeout(() => {
1781
- setDelayedOnHover(onHover);
1782
- }, 400);
1783
- return () => clearTimeout(timer);
1784
- }, [onHover]);
1785
- return import_react60.default.createElement(ToolbarContext.Provider, {
1709
+ return /* @__PURE__ */ import_react59.default.createElement(ToolbarContext.Provider, {
1786
1710
  value: __spreadValues({ theme, icons }, hook)
1787
- }, import_react60.default.createElement(import_framer_motion.AnimatePresence, null, expanded ? import_react60.default.createElement(import_framer_motion.motion.div, {
1788
- initial: { x: -100 },
1789
- animate: { x: 0, transition: { duration: 0.5 } },
1711
+ }, /* @__PURE__ */ import_react59.default.createElement(import_framer_motion.AnimatePresence, null, expanded ? /* @__PURE__ */ import_react59.default.createElement(import_framer_motion.motion.div, {
1790
1712
  key: "toolbar",
1791
- ref: toolbarRef,
1792
1713
  className: (0, import_clsx9.default)(name4, theme),
1793
- onPointerEnter: () => {
1794
- expanded && setOnHover(true);
1795
- },
1796
- onMouseLeave: () => setOnHover(false),
1714
+ initial: { x: -100 },
1715
+ animate: { x: 0, transition: { duration: 0.5 } },
1797
1716
  exit: { x: -100, transition: { duration: 0.5 } },
1798
- onAnimationStart: () => setPointEvents(false),
1799
- onAnimationComplete: () => setPointEvents(true),
1800
- style: { pointerEvents: pointEvents ? "auto" : "none" }
1801
- }, import_react60.default.createElement(Content, null), expanded && (onHover || delayedOnHover) && import_react60.default.createElement(Mask, {
1802
- toolbar
1803
- }, import_react60.default.createElement("div", {
1804
- onClick: toggle
1805
- }, import_react60.default.createElement("img", {
1806
- draggable: false,
1807
- className: (0, import_clsx9.default)(`${name4}-mask-btn`, theme),
1808
- src: collapsed_default
1809
- })))) : import_react60.default.createElement(import_framer_motion.motion.div, {
1717
+ onAnimationStart: () => setPointerEvents("none"),
1718
+ onAnimationComplete: () => setPointerEvents("auto"),
1719
+ style: { pointerEvents }
1720
+ }, /* @__PURE__ */ import_react59.default.createElement(Content, {
1721
+ onCollapse: () => setExpanded(false)
1722
+ })) : /* @__PURE__ */ import_react59.default.createElement(import_framer_motion.motion.div, {
1810
1723
  className: (0, import_clsx9.default)(`${name4}-expand-btn`, theme),
1811
1724
  key: "expand",
1812
- onClick: toggle,
1725
+ onClick: () => setExpanded(true),
1813
1726
  initial: { x: -100 },
1814
1727
  animate: { x: 0, transition: { duration: 0.5 } }
1815
- }, !expanded && import_react60.default.createElement(Icon, {
1816
- fallback: import_react60.default.createElement("img", {
1728
+ }, /* @__PURE__ */ import_react59.default.createElement(Icon, {
1729
+ fallback: /* @__PURE__ */ import_react59.default.createElement("img", {
1817
1730
  draggable: false,
1818
1731
  src: expanded_default,
1819
1732
  className: (0, import_clsx9.default)(`${name4}-mask-btn`, theme)
1820
1733
  }),
1821
1734
  src: disabled ? icons == null ? void 0 : icons.expandIconDisable : icons == null ? void 0 : icons.expandIcon
1822
1735
  }))));
1823
- };
1736
+ }
1824
1737
 
1825
1738
  // src/components/PlayerControl/hooks.ts
1826
- var import_react61 = require("react");
1739
+ var import_react60 = require("react");
1827
1740
  var import_white_web_sdk6 = require("white-web-sdk");
1828
1741
  var EMPTY_ARRAY = [];
1829
1742
  function useForceUpdate2() {
1830
- const [, forceUpdate_] = (0, import_react61.useState)({});
1831
- return (0, import_react61.useCallback)(() => forceUpdate_({}), EMPTY_ARRAY);
1743
+ const [, forceUpdate_] = (0, import_react60.useState)({});
1744
+ return (0, import_react60.useCallback)(() => forceUpdate_({}), EMPTY_ARRAY);
1832
1745
  }
1833
1746
  function usePlayerControl(player) {
1834
- const togglePlay = (0, import_react61.useCallback)(() => {
1747
+ const togglePlay = (0, import_react60.useCallback)(() => {
1835
1748
  if (player) {
1836
1749
  switch (player.phase) {
1837
1750
  case import_white_web_sdk6.PlayerPhase.WaitingFirstFrame:
@@ -1847,25 +1760,25 @@ function usePlayerControl(player) {
1847
1760
  }
1848
1761
  }
1849
1762
  }, [player]);
1850
- const seekToProgressTime = (0, import_react61.useCallback)((time) => {
1763
+ const seekToProgressTime = (0, import_react60.useCallback)((time) => {
1851
1764
  if (player) {
1852
1765
  player.seekToProgressTime(time);
1853
1766
  }
1854
1767
  }, [player]);
1855
1768
  const lastPlayer = useLastValue(player);
1856
1769
  const forceUpdate = useForceUpdate2();
1857
- const setSpeed = (0, import_react61.useCallback)((speed2) => {
1770
+ const setSpeed = (0, import_react60.useCallback)((speed2) => {
1858
1771
  if (player) {
1859
1772
  player.playbackSpeed = speed2;
1860
1773
  forceUpdate();
1861
1774
  }
1862
1775
  }, [forceUpdate, player]);
1863
- (0, import_react61.useEffect)(() => {
1776
+ (0, import_react60.useEffect)(() => {
1864
1777
  if (!lastPlayer && player) {
1865
1778
  forceUpdate();
1866
1779
  }
1867
1780
  }, [forceUpdate, lastPlayer, player]);
1868
- (0, import_react61.useEffect)(() => {
1781
+ (0, import_react60.useEffect)(() => {
1869
1782
  if (player) {
1870
1783
  player.callbacks.on("onPhaseChanged", forceUpdate);
1871
1784
  player.callbacks.on("onProgressTimeChanged", forceUpdate);
@@ -1891,19 +1804,19 @@ function usePlayerControl(player) {
1891
1804
  }
1892
1805
 
1893
1806
  // src/components/PlayerControl/PlayerControl.tsx
1894
- var import_react68 = __toESM(require("@tippyjs/react"));
1807
+ var import_react67 = __toESM(require("@tippyjs/react"));
1895
1808
  var import_clsx11 = __toESM(require("clsx"));
1896
1809
  var import_rc_slider2 = __toESM(require("rc-slider"));
1897
- var import_react69 = __toESM(require("react"));
1810
+ var import_react68 = __toESM(require("react"));
1898
1811
  var import_white_web_sdk7 = require("white-web-sdk");
1899
1812
 
1900
1813
  // src/components/PlayerControl/components/Button.tsx
1901
1814
  var import_clsx10 = __toESM(require("clsx"));
1902
- var import_react62 = __toESM(require("react"));
1903
- var import_react63 = __toESM(require("@tippyjs/react"));
1904
- var Button2 = (0, import_react62.forwardRef)((props, ref) => {
1815
+ var import_react61 = __toESM(require("react"));
1816
+ var import_react62 = __toESM(require("@tippyjs/react"));
1817
+ var Button2 = (0, import_react61.forwardRef)((props, ref) => {
1905
1818
  const { theme, content, disabled, active, onClick, interactive, placement = "top", children } = props;
1906
- return import_react62.default.createElement(import_react63.default, {
1819
+ return /* @__PURE__ */ import_react61.default.createElement(import_react62.default, {
1907
1820
  className: "fastboard-tip",
1908
1821
  content,
1909
1822
  interactive,
@@ -1913,7 +1826,7 @@ var Button2 = (0, import_react62.forwardRef)((props, ref) => {
1913
1826
  offset: TopOffset,
1914
1827
  delay: [1e3, 400],
1915
1828
  duration: 300
1916
- }, import_react62.default.createElement("button", {
1829
+ }, /* @__PURE__ */ import_react61.default.createElement("button", {
1917
1830
  ref,
1918
1831
  className: (0, import_clsx10.default)("fastboard-player-control-btn", theme, { active }),
1919
1832
  onClick,
@@ -1922,39 +1835,39 @@ var Button2 = (0, import_react62.forwardRef)((props, ref) => {
1922
1835
  });
1923
1836
 
1924
1837
  // src/components/PlayerControl/icons/index.ts
1925
- var import_react67 = require("react");
1838
+ var import_react66 = require("react");
1926
1839
 
1927
1840
  // src/components/PlayerControl/icons/Loading.tsx
1928
- var import_react64 = __toESM(require("react"));
1841
+ var import_react63 = __toESM(require("react"));
1929
1842
  var Loading = (props) => {
1930
1843
  const stroke = getStroke(props);
1931
- return import_react64.default.createElement("svg", {
1844
+ return /* @__PURE__ */ import_react63.default.createElement("svg", {
1932
1845
  viewBox: "0 0 24 24"
1933
- }, import_react64.default.createElement("path", {
1846
+ }, /* @__PURE__ */ import_react63.default.createElement("path", {
1934
1847
  d: "M12 4V2A10 10 0 0 0 2 12h2a8 8 0 0 1 8-8z",
1935
1848
  fill: stroke
1936
1849
  }));
1937
1850
  };
1938
1851
 
1939
1852
  // src/components/PlayerControl/icons/Pause.tsx
1940
- var import_react65 = __toESM(require("react"));
1853
+ var import_react64 = __toESM(require("react"));
1941
1854
  var Pause = (props) => {
1942
1855
  const stroke = getStroke(props);
1943
- return import_react65.default.createElement("svg", {
1856
+ return /* @__PURE__ */ import_react64.default.createElement("svg", {
1944
1857
  viewBox: "0 0 24 24"
1945
- }, import_react65.default.createElement("path", {
1858
+ }, /* @__PURE__ */ import_react64.default.createElement("path", {
1946
1859
  d: "M14 19h4V5h-4M6 19h4V5H6v14z",
1947
1860
  fill: stroke
1948
1861
  }));
1949
1862
  };
1950
1863
 
1951
1864
  // src/components/PlayerControl/icons/Play.tsx
1952
- var import_react66 = __toESM(require("react"));
1865
+ var import_react65 = __toESM(require("react"));
1953
1866
  var Play = (props) => {
1954
1867
  const stroke = getStroke(props);
1955
- return import_react66.default.createElement("svg", {
1868
+ return /* @__PURE__ */ import_react65.default.createElement("svg", {
1956
1869
  viewBox: "0 0 24 24"
1957
- }, import_react66.default.createElement("path", {
1870
+ }, /* @__PURE__ */ import_react65.default.createElement("path", {
1958
1871
  d: "M8 5.14v14l11-7l-11-7z",
1959
1872
  fill: stroke
1960
1873
  }));
@@ -1962,9 +1875,9 @@ var Play = (props) => {
1962
1875
 
1963
1876
  // src/components/PlayerControl/icons/index.ts
1964
1877
  var Icons2 = {
1965
- Play: (0, import_react67.memo)(Play),
1966
- Pause: (0, import_react67.memo)(Pause),
1967
- Loading: (0, import_react67.memo)(Loading)
1878
+ Play: (0, import_react66.memo)(Play),
1879
+ Pause: (0, import_react66.memo)(Pause),
1880
+ Loading: (0, import_react66.memo)(Loading)
1968
1881
  };
1969
1882
 
1970
1883
  // src/components/PlayerControl/PlayerControl.tsx
@@ -1973,12 +1886,12 @@ function PlayerControl(_a) {
1973
1886
  var _b = _a, { theme, autoHide = false, player: player_ } = _b, icons = __objRest(_b, ["theme", "autoHide", "player"]);
1974
1887
  theme = useTheme(theme);
1975
1888
  const { t } = useTranslation();
1976
- const [currentTime, setCurrentTime] = (0, import_react69.useState)(0);
1889
+ const [currentTime, setCurrentTime] = (0, import_react68.useState)(0);
1977
1890
  const player = usePlayerControl(player_);
1978
- (0, import_react69.useEffect)(() => {
1891
+ (0, import_react68.useEffect)(() => {
1979
1892
  setCurrentTime(player.currentTime);
1980
1893
  }, [player.currentTime]);
1981
- (0, import_react69.useEffect)(() => {
1894
+ (0, import_react68.useEffect)(() => {
1982
1895
  if (player.currentTime !== currentTime) {
1983
1896
  player.seekToProgressTime(currentTime);
1984
1897
  }
@@ -1986,25 +1899,25 @@ function PlayerControl(_a) {
1986
1899
  const isLoading = player.phase === import_white_web_sdk7.PlayerPhase.WaitingFirstFrame || player.phase === import_white_web_sdk7.PlayerPhase.Buffering;
1987
1900
  const isPlaying = player.phase === import_white_web_sdk7.PlayerPhase.Playing;
1988
1901
  const { activeColor } = themes[theme];
1989
- return import_react69.default.createElement("div", {
1902
+ return /* @__PURE__ */ import_react68.default.createElement("div", {
1990
1903
  className: (0, import_clsx11.default)(name5, theme, { "auto-hide": autoHide })
1991
- }, import_react69.default.createElement("button", {
1904
+ }, /* @__PURE__ */ import_react68.default.createElement("button", {
1992
1905
  className: (0, import_clsx11.default)(`${name5}-btn`, isLoading ? "loading" : isPlaying ? "pause" : "play", theme),
1993
1906
  disabled: isLoading,
1994
1907
  onClick: player.togglePlay
1995
- }, import_react69.default.createElement(Icon, {
1996
- fallback: isLoading ? import_react69.default.createElement(Icons2.Loading, {
1908
+ }, /* @__PURE__ */ import_react68.default.createElement(Icon, {
1909
+ fallback: isLoading ? /* @__PURE__ */ import_react68.default.createElement(Icons2.Loading, {
1997
1910
  theme
1998
- }) : isPlaying ? import_react69.default.createElement(Icons2.Pause, {
1911
+ }) : isPlaying ? /* @__PURE__ */ import_react68.default.createElement(Icons2.Pause, {
1999
1912
  theme
2000
- }) : import_react69.default.createElement(Icons2.Play, {
1913
+ }) : /* @__PURE__ */ import_react68.default.createElement(Icons2.Play, {
2001
1914
  theme
2002
1915
  }),
2003
1916
  src: isLoading ? icons.loadingIcon : isPlaying ? icons.pauseIcon : icons.playIcon,
2004
1917
  alt: isLoading ? "[loading]" : isPlaying ? "[pause]" : "[play]"
2005
- })), import_react69.default.createElement("span", {
1918
+ })), /* @__PURE__ */ import_react68.default.createElement("span", {
2006
1919
  className: (0, import_clsx11.default)(`${name5}-slider`, { loading: isLoading }, theme)
2007
- }, import_react69.default.createElement(import_rc_slider2.default, {
1920
+ }, /* @__PURE__ */ import_react68.default.createElement(import_rc_slider2.default, {
2008
1921
  disabled: isLoading,
2009
1922
  trackStyle: { background: activeColor },
2010
1923
  handleStyle: { border: `1px solid ${activeColor}` },
@@ -2013,15 +1926,15 @@ function PlayerControl(_a) {
2013
1926
  min: 0,
2014
1927
  max: player.totalTime,
2015
1928
  step: 100
2016
- })), import_react69.default.createElement("span", {
1929
+ })), /* @__PURE__ */ import_react68.default.createElement("span", {
2017
1930
  className: (0, import_clsx11.default)(`${name5}-current`, theme)
2018
- }, renderTime(player.currentTime)), import_react69.default.createElement("span", {
1931
+ }, renderTime(player.currentTime)), /* @__PURE__ */ import_react68.default.createElement("span", {
2019
1932
  className: (0, import_clsx11.default)(`${name5}-slash`, theme)
2020
- }, "/"), import_react69.default.createElement("span", {
1933
+ }, "/"), /* @__PURE__ */ import_react68.default.createElement("span", {
2021
1934
  className: (0, import_clsx11.default)(`${name5}-total`, theme)
2022
- }, renderTime(player.totalTime)), import_react69.default.createElement("span", {
1935
+ }, renderTime(player.totalTime)), /* @__PURE__ */ import_react68.default.createElement("span", {
2023
1936
  className: `${name5}-btn-interactive`
2024
- }, import_react69.default.createElement(import_react68.default, {
1937
+ }, /* @__PURE__ */ import_react68.default.createElement(import_react67.default, {
2025
1938
  className: "fastboard-tip",
2026
1939
  content: renderSpeeds(player),
2027
1940
  theme,
@@ -2030,11 +1943,11 @@ function PlayerControl(_a) {
2030
1943
  offset: TopOffset,
2031
1944
  arrow: false,
2032
1945
  interactive: true
2033
- }, import_react69.default.createElement(Button2, {
1946
+ }, /* @__PURE__ */ import_react68.default.createElement(Button2, {
2034
1947
  content: t("speed"),
2035
1948
  theme,
2036
1949
  disabled: isLoading
2037
- }, import_react69.default.createElement("span", {
1950
+ }, /* @__PURE__ */ import_react68.default.createElement("span", {
2038
1951
  className: (0, import_clsx11.default)(`${name5}-speed-text`, theme)
2039
1952
  }, player.speed, "x")))));
2040
1953
  }
@@ -2046,9 +1959,9 @@ function renderTime(ms) {
2046
1959
  }
2047
1960
  var Speeds = [2, 1.5, 1.25, 1, 0.75, 0.5];
2048
1961
  function renderSpeeds({ speed: current, setSpeed }) {
2049
- return import_react69.default.createElement("div", {
1962
+ return /* @__PURE__ */ import_react68.default.createElement("div", {
2050
1963
  className: (0, import_clsx11.default)(`${name5}-panel`, "speed")
2051
- }, Speeds.map((speed) => import_react69.default.createElement("button", {
1964
+ }, Speeds.map((speed) => /* @__PURE__ */ import_react68.default.createElement("button", {
2052
1965
  className: (0, import_clsx11.default)(`${name5}-btn`, "speed", {
2053
1966
  active: speed === current
2054
1967
  }),
@@ -2058,34 +1971,49 @@ function renderSpeeds({ speed: current, setSpeed }) {
2058
1971
  }
2059
1972
 
2060
1973
  // src/components/Fastboard.tsx
2061
- var import_react70 = __toESM(require("react"));
2062
- function Fastboard(_a) {
2063
- var _b = _a, { app } = _b, restProps = __objRest(_b, ["app"]);
1974
+ var import_react69 = __toESM(require("react"));
1975
+ var Fastboard = /* @__PURE__ */ (0, import_react69.forwardRef)(function Fastboard2(_a, ref) {
1976
+ var _b = _a, { app, theme, layout, language } = _b, restProps = __objRest(_b, ["app", "theme", "layout", "language"]);
2064
1977
  if (!app) {
2065
- return import_react70.default.createElement("div", {
2066
- className: "fastboard-root"
2067
- });
1978
+ return /* @__PURE__ */ import_react69.default.createElement("div", __spreadValues({
1979
+ className: "fastboard-root",
1980
+ ref
1981
+ }, restProps));
2068
1982
  }
2069
- return import_react70.default.createElement(FastboardAppContext.Provider, {
1983
+ return /* @__PURE__ */ import_react69.default.createElement(FastboardAppContext.Provider, {
2070
1984
  value: app
2071
- }, import_react70.default.createElement(FastboardInternal, __spreadValues({}, restProps)));
2072
- }
2073
- function FastboardInternal({
2074
- language,
2075
- layout = {},
2076
- theme = "light",
2077
- children
2078
- }) {
1985
+ }, /* @__PURE__ */ import_react69.default.createElement(FastboardInternal, __spreadValues(__spreadValues({
1986
+ forwardedRef: ref
1987
+ }, { theme, layout, language }), restProps)));
1988
+ });
1989
+ function FastboardInternal(_a) {
1990
+ var _b = _a, {
1991
+ forwardedRef,
1992
+ language,
1993
+ layout = {},
1994
+ theme = "light",
1995
+ children
1996
+ } = _b, restProps = __objRest(_b, [
1997
+ "forwardedRef",
1998
+ "language",
1999
+ "layout",
2000
+ "theme",
2001
+ "children"
2002
+ ]);
2079
2003
  const app = useFastboardApp();
2080
2004
  const forceUpdate = useForceUpdate();
2081
2005
  const i18n = useAsyncValue(() => createI18n({ language }));
2082
- (0, import_react70.useEffect)(() => {
2006
+ (0, import_react69.useEffect)(() => {
2083
2007
  if (i18n)
2084
2008
  i18n.changeLanguage(language);
2085
2009
  forceUpdate();
2086
2010
  }, [forceUpdate, i18n, language]);
2087
- const useWhiteboard = (0, import_react70.useCallback)((container) => {
2088
- container && app && app.manager.bindContainer(container);
2011
+ (0, import_react69.useEffect)(() => {
2012
+ app.manager.setPrefersColorScheme(theme);
2013
+ }, [app, theme]);
2014
+ const useWhiteboard = (0, import_react69.useCallback)((container) => {
2015
+ if (container && app)
2016
+ app.manager.bindContainer(container);
2089
2017
  }, [app]);
2090
2018
  const hideControls = useHideControls();
2091
2019
  const showControls = !hideControls;
@@ -2095,22 +2023,33 @@ function FastboardInternal({
2095
2023
  ZoomControl: zoom_control = showControls,
2096
2024
  PageControl: page_control = showControls
2097
2025
  } = layout;
2098
- return import_react70.default.createElement(ThemeContext.Provider, {
2026
+ return /* @__PURE__ */ import_react69.default.createElement(ThemeContext.Provider, {
2099
2027
  value: theme
2100
- }, import_react70.default.createElement(I18nContext.Provider, {
2028
+ }, /* @__PURE__ */ import_react69.default.createElement(I18nContext.Provider, {
2101
2029
  value: i18n
2102
- }, import_react70.default.createElement("div", {
2103
- className: "fastboard-root"
2104
- }, import_react70.default.createElement("div", {
2030
+ }, /* @__PURE__ */ import_react69.default.createElement("div", __spreadProps(__spreadValues({}, restProps), {
2031
+ className: "fastboard-root",
2032
+ ref: forwardedRef
2033
+ }), /* @__PURE__ */ import_react69.default.createElement("div", {
2105
2034
  className: "fastboard-view",
2106
2035
  ref: useWhiteboard
2107
- }), children ? children : import_react70.default.createElement(import_react70.default.Fragment, null, toolbar && import_react70.default.createElement("div", {
2036
+ }), children ? children : /* @__PURE__ */ import_react69.default.createElement(import_react69.default.Fragment, null, toolbar && /* @__PURE__ */ import_react69.default.createElement("div", {
2108
2037
  className: "fastboard-left"
2109
- }, import_react70.default.createElement(Toolbar, null)), (redo_undo || zoom_control) && import_react70.default.createElement("div", {
2038
+ }, /* @__PURE__ */ import_react69.default.createElement(Toolbar, null)), (redo_undo || zoom_control) && /* @__PURE__ */ import_react69.default.createElement("div", {
2110
2039
  className: "fastboard-bottom-left"
2111
- }, redo_undo && import_react70.default.createElement(RedoUndo, null), zoom_control && import_react70.default.createElement(ZoomControl, null)), page_control && import_react70.default.createElement("div", {
2040
+ }, redo_undo && /* @__PURE__ */ import_react69.default.createElement(RedoUndo, null), zoom_control && /* @__PURE__ */ import_react69.default.createElement(ZoomControl, null)), page_control && /* @__PURE__ */ import_react69.default.createElement("div", {
2112
2041
  className: "fastboard-bottom-right"
2113
- }, import_react70.default.createElement(PageControl, null))))));
2042
+ }, /* @__PURE__ */ import_react69.default.createElement(PageControl, null))))));
2043
+ }
2044
+
2045
+ // src/vanilla/index.tsx
2046
+ var import_react70 = __toESM(require("react"));
2047
+ var import_react_dom = __toESM(require("react-dom"));
2048
+ function mount(app, dom, props) {
2049
+ import_react_dom.default.render(/* @__PURE__ */ import_react70.default.createElement(Fastboard, __spreadValues({
2050
+ app
2051
+ }, props)), dom);
2052
+ return () => import_react_dom.default.unmountComponentAtNode(dom);
2114
2053
  }
2115
2054
  module.exports = __toCommonJS(src_exports);
2116
2055
  //# sourceMappingURL=index.js.map