@netless/fastboard-react 0.1.0 → 0.1.1

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 (78) hide show
  1. package/dist/index.js +48 -70
  2. package/dist/index.js.map +1 -1
  3. package/dist/index.mjs +75 -97
  4. package/dist/index.mjs.map +1 -1
  5. package/package.json +4 -3
  6. package/src/components/Fastboard.tsx +21 -10
  7. package/src/components/PageControl/PageControl.tsx +2 -4
  8. package/src/components/PageControl/hooks.ts +18 -61
  9. package/dist/behaviors/style.d.ts +0 -1
  10. package/dist/components/Fastboard.d.ts +0 -15
  11. package/dist/components/PageControl/PageControl.d.ts +0 -5
  12. package/dist/components/PageControl/hooks.d.ts +0 -9
  13. package/dist/components/PageControl/index.d.ts +0 -2
  14. package/dist/components/PlayerControl/PlayerControl.d.ts +0 -9
  15. package/dist/components/PlayerControl/hooks.d.ts +0 -11
  16. package/dist/components/PlayerControl/icons/Loading.d.ts +0 -3
  17. package/dist/components/PlayerControl/icons/Pause.d.ts +0 -3
  18. package/dist/components/PlayerControl/icons/Play.d.ts +0 -3
  19. package/dist/components/PlayerControl/icons/index.d.ts +0 -6
  20. package/dist/components/PlayerControl/index.d.ts +0 -2
  21. package/dist/components/RedoUndo/RedoUndo.d.ts +0 -5
  22. package/dist/components/RedoUndo/hooks.d.ts +0 -6
  23. package/dist/components/RedoUndo/index.d.ts +0 -2
  24. package/dist/components/Toolbar/Content.d.ts +0 -2
  25. package/dist/components/Toolbar/Toolbar.d.ts +0 -14
  26. package/dist/components/Toolbar/components/ApplianceButtons.d.ts +0 -7
  27. package/dist/components/Toolbar/components/AppsButton.d.ts +0 -6
  28. package/dist/components/Toolbar/components/ColorBox.d.ts +0 -2
  29. package/dist/components/Toolbar/components/CutLine.d.ts +0 -2
  30. package/dist/components/Toolbar/components/Mask.d.ts +0 -7
  31. package/dist/components/Toolbar/components/PencilButton.d.ts +0 -2
  32. package/dist/components/Toolbar/components/ShapesButton.d.ts +0 -3
  33. package/dist/components/Toolbar/components/Slider.d.ts +0 -2
  34. package/dist/components/Toolbar/components/TextButton.d.ts +0 -2
  35. package/dist/components/Toolbar/components/UpDownButtons.d.ts +0 -7
  36. package/dist/components/Toolbar/const.d.ts +0 -18
  37. package/dist/components/Toolbar/hooks.d.ts +0 -12
  38. package/dist/components/Toolbar/icons/Apps.d.ts +0 -3
  39. package/dist/components/Toolbar/icons/Arrow.d.ts +0 -3
  40. package/dist/components/Toolbar/icons/Circle.d.ts +0 -3
  41. package/dist/components/Toolbar/icons/Clean.d.ts +0 -3
  42. package/dist/components/Toolbar/icons/Clicker.d.ts +0 -3
  43. package/dist/components/Toolbar/icons/Collapse.d.ts +0 -3
  44. package/dist/components/Toolbar/icons/Diamond.d.ts +0 -3
  45. package/dist/components/Toolbar/icons/Down.d.ts +0 -3
  46. package/dist/components/Toolbar/icons/Eraser.d.ts +0 -3
  47. package/dist/components/Toolbar/icons/Expand.d.ts +0 -3
  48. package/dist/components/Toolbar/icons/Line.d.ts +0 -3
  49. package/dist/components/Toolbar/icons/Pencil.d.ts +0 -3
  50. package/dist/components/Toolbar/icons/Rectangle.d.ts +0 -3
  51. package/dist/components/Toolbar/icons/Selector.d.ts +0 -3
  52. package/dist/components/Toolbar/icons/SpeechBalloon.d.ts +0 -3
  53. package/dist/components/Toolbar/icons/Star.d.ts +0 -3
  54. package/dist/components/Toolbar/icons/Text.d.ts +0 -3
  55. package/dist/components/Toolbar/icons/Triangle.d.ts +0 -3
  56. package/dist/components/Toolbar/icons/Up.d.ts +0 -3
  57. package/dist/components/Toolbar/icons/index.d.ts +0 -22
  58. package/dist/components/Toolbar/index.d.ts +0 -2
  59. package/dist/components/ZoomControl/ZoomControl.d.ts +0 -5
  60. package/dist/components/ZoomControl/hooks.d.ts +0 -7
  61. package/dist/components/ZoomControl/index.d.ts +0 -2
  62. package/dist/components/hooks.d.ts +0 -13
  63. package/dist/i18n/index.d.ts +0 -12
  64. package/dist/icons/ChevronLeft.d.ts +0 -3
  65. package/dist/icons/ChevronRight.d.ts +0 -3
  66. package/dist/icons/FilePlus.d.ts +0 -3
  67. package/dist/icons/Minus.d.ts +0 -3
  68. package/dist/icons/Plus.d.ts +0 -3
  69. package/dist/icons/Redo.d.ts +0 -3
  70. package/dist/icons/Reset.d.ts +0 -3
  71. package/dist/icons/Undo.d.ts +0 -3
  72. package/dist/icons/index.d.ts +0 -7
  73. package/dist/index.d.ts +0 -9
  74. package/dist/internal/helpers.d.ts +0 -16
  75. package/dist/internal/hooks.d.ts +0 -3
  76. package/dist/internal/index.d.ts +0 -2
  77. package/dist/theme.d.ts +0 -16
  78. package/dist/typings.d.ts +0 -10
package/dist/index.mjs CHANGED
@@ -581,59 +581,22 @@ function ZoomControl({
581
581
  }
582
582
 
583
583
  // src/components/PageControl/hooks.ts
584
- import { useCallback as useCallback4, useEffect as useEffect3, useState as useState3 } from "react";
585
- function usePageControl(room, manager) {
586
- const [pageIndex, setPageIndex] = useState3(0);
587
- const [pageCount, setPageCount] = useState3(0);
584
+ import { useCallback as useCallback4 } from "react";
585
+ function usePageControl() {
586
+ const app = useFastboardApp();
587
+ const pageIndex = useFastboardValue(app.sceneIndex);
588
+ const pageCount = useFastboardValue(app.sceneLength);
588
589
  const addPage = useCallback4(async () => {
589
- if (manager && room) {
590
- await manager.switchMainViewToWriter();
591
- const path = room.state.sceneState.contextPath;
592
- room.putScenes(path, [{}], pageIndex + 1);
593
- await manager.setMainViewSceneIndex(pageIndex + 1);
594
- } else if (!manager && room) {
595
- const path = room.state.sceneState.contextPath;
596
- room.putScenes(path, [{}], pageIndex + 1);
597
- room.setSceneIndex(pageIndex + 1);
598
- }
599
- }, [room, manager, pageIndex]);
600
- const prevPage = useCallback4(() => {
601
- if (manager) {
602
- manager.setMainViewSceneIndex(pageIndex - 1);
603
- } else if (room) {
604
- room.pptPreviousStep();
605
- }
606
- }, [room, manager, pageIndex]);
607
- const nextPage = useCallback4(() => {
608
- if (manager) {
609
- manager.setMainViewSceneIndex(pageIndex + 1);
610
- } else if (room) {
611
- room.pptNextStep();
612
- }
613
- }, [room, manager, pageIndex]);
614
- useEffect3(() => {
615
- if (room) {
616
- setPageIndex(room.state.sceneState.index);
617
- setPageCount(room.state.sceneState.scenes.length);
618
- if (manager) {
619
- manager.emitter.on("mainViewSceneIndexChange", setPageIndex);
620
- return () => {
621
- manager.emitter.off("mainViewSceneIndexChange", setPageIndex);
622
- };
623
- } else {
624
- const onRoomStateChanged = (modifyState) => {
625
- if (modifyState.sceneState) {
626
- setPageIndex(modifyState.sceneState.index);
627
- setPageCount(modifyState.sceneState.scenes.length);
628
- }
629
- };
630
- room.callbacks.on("onRoomStateChanged", onRoomStateChanged);
631
- return () => {
632
- room.callbacks.off("onRoomStateChanged", onRoomStateChanged);
633
- };
634
- }
635
- }
636
- }, [room, manager]);
590
+ await app.manager.switchMainViewToWriter();
591
+ app.room.putScenes(app.manager.mainViewSceneDir, [{}], pageIndex + 1);
592
+ await app.manager.setMainViewSceneIndex(pageIndex + 1);
593
+ }, [app, pageIndex]);
594
+ const prevPage = useCallback4(async () => {
595
+ await app.manager.setMainViewSceneIndex(pageIndex - 1);
596
+ }, [app, pageIndex]);
597
+ const nextPage = useCallback4(async () => {
598
+ await app.manager.setMainViewSceneIndex(pageIndex + 1);
599
+ }, [app, pageIndex]);
637
600
  return { pageIndex, pageCount, prevPage, nextPage, addPage };
638
601
  }
639
602
 
@@ -698,11 +661,10 @@ function PageControl({
698
661
  nextIcon,
699
662
  nextIconDisable
700
663
  }) {
701
- const app = useFastboardApp();
702
664
  theme = useTheme(theme);
703
665
  const { t } = useTranslation();
704
666
  const writable = useWritable();
705
- const _a = usePageControl(app.room, app.manager), { pageIndex, pageCount } = _a, actions = __objRest(_a, ["pageIndex", "pageCount"]);
667
+ const _a = usePageControl(), { pageIndex, pageCount } = _a, actions = __objRest(_a, ["pageIndex", "pageCount"]);
706
668
  const disabled = !writable;
707
669
  return React12.createElement("div", {
708
670
  className: clsx3(name3, theme)
@@ -814,7 +776,7 @@ var EmptyToolbarHook = {
814
776
  // src/components/Toolbar/Toolbar.tsx
815
777
  import clsx9 from "clsx";
816
778
  import { AnimatePresence, motion } from "framer-motion";
817
- import React44, { createContext as createContext3, useCallback as useCallback11, useEffect as useEffect6, useState as useState6 } from "react";
779
+ import React44, { createContext as createContext3, useCallback as useCallback11, useEffect as useEffect5, useState as useState5 } from "react";
818
780
 
819
781
  // src/components/Toolbar/components/assets/collapsed.png
820
782
  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";
@@ -823,20 +785,20 @@ var collapsed_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAB8C
823
785
  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==";
824
786
 
825
787
  // src/components/Toolbar/components/Mask.tsx
826
- import React13, { useState as useState4, useEffect as useEffect4 } from "react";
788
+ import React13, { useState as useState3, useEffect as useEffect3 } from "react";
827
789
  import ReactDOM from "react-dom";
828
790
  var Mask = React13.memo(({ toolbar, children }) => {
829
- const [rootElement] = useState4(() => {
791
+ const [rootElement] = useState3(() => {
830
792
  const element = document.createElement("div");
831
793
  element.style.position = "absolute";
832
794
  return element;
833
795
  });
834
- useEffect4(() => {
796
+ useEffect3(() => {
835
797
  if (toolbar && rootElement) {
836
798
  toolbar.appendChild(rootElement);
837
799
  }
838
800
  }, [rootElement, toolbar]);
839
- useEffect4(() => {
801
+ useEffect3(() => {
840
802
  if (rootElement && toolbar) {
841
803
  toolbar.appendChild(rootElement);
842
804
  const toolbarRect = toolbar.getBoundingClientRect();
@@ -859,7 +821,7 @@ var Mask = React13.memo(({ toolbar, children }) => {
859
821
 
860
822
  // src/components/Toolbar/Content.tsx
861
823
  import clsx8 from "clsx";
862
- import React43, { useCallback as useCallback10, useEffect as useEffect5, useRef as useRef2, useState as useState5 } from "react";
824
+ import React43, { useCallback as useCallback10, useEffect as useEffect4, useRef as useRef2, useState as useState4 } from "react";
863
825
 
864
826
  // src/components/Toolbar/components/ApplianceButtons.tsx
865
827
  import React34, { useCallback as useCallback6, useContext as useContext4 } from "react";
@@ -1657,8 +1619,8 @@ function DownButton({ disabled, scrollTo }) {
1657
1619
  // src/components/Toolbar/Content.tsx
1658
1620
  var Content = React43.memo(() => {
1659
1621
  const ref = useRef2(null);
1660
- const [scrollTop, setScrollTop] = useState5(0);
1661
- const [parentHeight, setParentHeight] = useState5(0);
1622
+ const [scrollTop, setScrollTop] = useState4(0);
1623
+ const [parentHeight, setParentHeight] = useState4(0);
1662
1624
  const needScroll = parentHeight < ItemHeight * ItemsCount + 48;
1663
1625
  const sectionHeight = clamp(parentHeight - 48 * (needScroll ? 3 : 1), MinHeight, MaxHeight);
1664
1626
  const scrollBuffer = Math.max(parentHeight - sectionHeight - 1, 0);
@@ -1667,12 +1629,12 @@ var Content = React43.memo(() => {
1667
1629
  const scrollTo = useCallback10((height) => {
1668
1630
  setScrollTop(clamp(scrollTop + height, 0, scrollBuffer));
1669
1631
  }, [scrollBuffer, scrollTop]);
1670
- useEffect5(() => {
1632
+ useEffect4(() => {
1671
1633
  if (ref.current) {
1672
1634
  ref.current.scrollTop = scrollTop;
1673
1635
  }
1674
1636
  }, [scrollTop]);
1675
- useEffect5(() => {
1637
+ useEffect4(() => {
1676
1638
  var _a, _b;
1677
1639
  const container = (_b = (_a = ref.current) == null ? void 0 : _a.parentElement) == null ? void 0 : _b.parentElement;
1678
1640
  if (container) {
@@ -1709,16 +1671,16 @@ var name4 = "fastboard-toolbar";
1709
1671
  var Toolbar = ({ theme, icons }) => {
1710
1672
  theme = useTheme(theme);
1711
1673
  const hook = useToolbar();
1712
- const [expanded, setExpanded] = useState6(true);
1713
- const [toolbar, toolbarRef] = useState6(null);
1714
- const [onHover, setOnHover] = useState6(false);
1715
- const [delayedOnHover, setDelayedOnHover] = useState6(false);
1716
- const [pointEvents, setPointEvents] = useState6(true);
1674
+ const [expanded, setExpanded] = useState5(true);
1675
+ const [toolbar, toolbarRef] = useState5(null);
1676
+ const [onHover, setOnHover] = useState5(false);
1677
+ const [delayedOnHover, setDelayedOnHover] = useState5(false);
1678
+ const [pointEvents, setPointEvents] = useState5(true);
1717
1679
  const disabled = !hook.writable;
1718
1680
  const toggle = useCallback11(() => {
1719
1681
  setExpanded((e) => !e);
1720
1682
  }, []);
1721
- useEffect6(() => {
1683
+ useEffect5(() => {
1722
1684
  const timer = setTimeout(() => {
1723
1685
  setDelayedOnHover(onHover);
1724
1686
  }, 400);
@@ -1765,11 +1727,11 @@ var Toolbar = ({ theme, icons }) => {
1765
1727
  };
1766
1728
 
1767
1729
  // src/components/PlayerControl/hooks.ts
1768
- import { useCallback as useCallback12, useEffect as useEffect7, useState as useState7 } from "react";
1730
+ import { useCallback as useCallback12, useEffect as useEffect6, useState as useState6 } from "react";
1769
1731
  import { PlayerPhase } from "white-web-sdk";
1770
1732
  var EMPTY_ARRAY = [];
1771
1733
  function useForceUpdate2() {
1772
- const [, forceUpdate_] = useState7({});
1734
+ const [, forceUpdate_] = useState6({});
1773
1735
  return useCallback12(() => forceUpdate_({}), EMPTY_ARRAY);
1774
1736
  }
1775
1737
  function usePlayerControl(player) {
@@ -1802,12 +1764,12 @@ function usePlayerControl(player) {
1802
1764
  forceUpdate();
1803
1765
  }
1804
1766
  }, [forceUpdate, player]);
1805
- useEffect7(() => {
1767
+ useEffect6(() => {
1806
1768
  if (!lastPlayer && player) {
1807
1769
  forceUpdate();
1808
1770
  }
1809
1771
  }, [forceUpdate, lastPlayer, player]);
1810
- useEffect7(() => {
1772
+ useEffect6(() => {
1811
1773
  if (player) {
1812
1774
  player.callbacks.on("onPhaseChanged", forceUpdate);
1813
1775
  player.callbacks.on("onProgressTimeChanged", forceUpdate);
@@ -1836,7 +1798,7 @@ function usePlayerControl(player) {
1836
1798
  import Tippy10 from "@tippyjs/react";
1837
1799
  import clsx11 from "clsx";
1838
1800
  import RcSlider2 from "rc-slider";
1839
- import React49, { useEffect as useEffect8, useState as useState8 } from "react";
1801
+ import React49, { useEffect as useEffect7, useState as useState7 } from "react";
1840
1802
  import { PlayerPhase as PlayerPhase2 } from "white-web-sdk";
1841
1803
 
1842
1804
  // src/components/PlayerControl/components/Button.tsx
@@ -1915,12 +1877,12 @@ function PlayerControl(_a) {
1915
1877
  var _b = _a, { theme, autoHide = false, player: player_ } = _b, icons = __objRest(_b, ["theme", "autoHide", "player"]);
1916
1878
  theme = useTheme(theme);
1917
1879
  const { t } = useTranslation();
1918
- const [currentTime, setCurrentTime] = useState8(0);
1880
+ const [currentTime, setCurrentTime] = useState7(0);
1919
1881
  const player = usePlayerControl(player_);
1920
- useEffect8(() => {
1882
+ useEffect7(() => {
1921
1883
  setCurrentTime(player.currentTime);
1922
1884
  }, [player.currentTime]);
1923
- useEffect8(() => {
1885
+ useEffect7(() => {
1924
1886
  if (player.currentTime !== currentTime) {
1925
1887
  player.seekToProgressTime(currentTime);
1926
1888
  }
@@ -2000,34 +1962,49 @@ function renderSpeeds({ speed: current, setSpeed }) {
2000
1962
  }
2001
1963
 
2002
1964
  // src/components/Fastboard.tsx
2003
- import React50, { useCallback as useCallback13, useEffect as useEffect9 } from "react";
2004
- function Fastboard(_a) {
2005
- var _b = _a, { app } = _b, restProps = __objRest(_b, ["app"]);
1965
+ import React50, { forwardRef as forwardRef3, useCallback as useCallback13, useEffect as useEffect8 } from "react";
1966
+ var Fastboard = forwardRef3(function Fastboard2(_a, ref) {
1967
+ var _b = _a, { app, theme, layout, language } = _b, restProps = __objRest(_b, ["app", "theme", "layout", "language"]);
2006
1968
  if (!app) {
2007
- return React50.createElement("div", {
2008
- className: "fastboard-root"
2009
- });
1969
+ return React50.createElement("div", __spreadValues({
1970
+ className: "fastboard-root",
1971
+ ref
1972
+ }, restProps));
2010
1973
  }
2011
1974
  return React50.createElement(FastboardAppContext.Provider, {
2012
1975
  value: app
2013
- }, React50.createElement(FastboardInternal, __spreadValues({}, restProps)));
2014
- }
2015
- function FastboardInternal({
2016
- language,
2017
- layout = {},
2018
- theme = "light",
2019
- children
2020
- }) {
1976
+ }, React50.createElement(FastboardInternal, __spreadValues(__spreadValues({
1977
+ forwardedRef: ref
1978
+ }, { theme, layout, language }), restProps)));
1979
+ });
1980
+ function FastboardInternal(_a) {
1981
+ var _b = _a, {
1982
+ forwardedRef,
1983
+ language,
1984
+ layout = {},
1985
+ theme = "light",
1986
+ children
1987
+ } = _b, restProps = __objRest(_b, [
1988
+ "forwardedRef",
1989
+ "language",
1990
+ "layout",
1991
+ "theme",
1992
+ "children"
1993
+ ]);
2021
1994
  const app = useFastboardApp();
2022
1995
  const forceUpdate = useForceUpdate();
2023
1996
  const i18n = useAsyncValue(() => createI18n({ language }));
2024
- useEffect9(() => {
1997
+ useEffect8(() => {
2025
1998
  if (i18n)
2026
1999
  i18n.changeLanguage(language);
2027
2000
  forceUpdate();
2028
2001
  }, [forceUpdate, i18n, language]);
2002
+ useEffect8(() => {
2003
+ app.manager.setPrefersColorScheme(theme);
2004
+ }, [app, theme]);
2029
2005
  const useWhiteboard = useCallback13((container) => {
2030
- container && app && app.manager.bindContainer(container);
2006
+ if (container && app)
2007
+ app.manager.bindContainer(container);
2031
2008
  }, [app]);
2032
2009
  const hideControls = useHideControls();
2033
2010
  const showControls = !hideControls;
@@ -2041,9 +2018,10 @@ function FastboardInternal({
2041
2018
  value: theme
2042
2019
  }, React50.createElement(I18nContext.Provider, {
2043
2020
  value: i18n
2044
- }, React50.createElement("div", {
2045
- className: "fastboard-root"
2046
- }, React50.createElement("div", {
2021
+ }, React50.createElement("div", __spreadProps(__spreadValues({}, restProps), {
2022
+ className: "fastboard-root",
2023
+ ref: forwardedRef
2024
+ }), React50.createElement("div", {
2047
2025
  className: "fastboard-view",
2048
2026
  ref: useWhiteboard
2049
2027
  }), children ? children : React50.createElement(React50.Fragment, null, toolbar && React50.createElement("div", {