@excalidraw/excalidraw 0.17.1-c0b80a0 → 0.17.1-c329470

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 (178) hide show
  1. package/dist/browser/dev/excalidraw-assets-dev/{chunk-JGDL4H2X.js → chunk-3DLVY5XU.js} +8272 -6864
  2. package/dist/browser/dev/excalidraw-assets-dev/chunk-3DLVY5XU.js.map +7 -0
  3. package/dist/browser/dev/excalidraw-assets-dev/{chunk-V7NFEZA6.js → chunk-NOAEU4NM.js} +9 -2
  4. package/dist/browser/dev/excalidraw-assets-dev/chunk-NOAEU4NM.js.map +7 -0
  5. package/dist/browser/dev/excalidraw-assets-dev/{en-ZSVWGT55.js → en-7IBTMWBG.js} +2 -2
  6. package/dist/browser/dev/excalidraw-assets-dev/{image-RJG3J34Y.js → image-N5AC7SEK.js} +2 -6
  7. package/dist/browser/dev/index.css +85 -50
  8. package/dist/browser/dev/index.css.map +3 -3
  9. package/dist/browser/dev/index.js +4375 -3766
  10. package/dist/browser/dev/index.js.map +4 -4
  11. package/dist/browser/prod/excalidraw-assets/{chunk-LDVEIXGO.js → chunk-7CSIPVOW.js} +2 -2
  12. package/dist/browser/prod/excalidraw-assets/chunk-TX3BU7T2.js +47 -0
  13. package/dist/browser/prod/excalidraw-assets/{en-UPNEHLDS.js → en-LOGQBETY.js} +1 -1
  14. package/dist/browser/prod/excalidraw-assets/image-3V4U7GZE.js +1 -0
  15. package/dist/browser/prod/index.css +1 -1
  16. package/dist/browser/prod/index.js +40 -40
  17. package/dist/dev/index.css +85 -50
  18. package/dist/dev/index.css.map +3 -3
  19. package/dist/dev/index.js +8688 -6706
  20. package/dist/dev/index.js.map +4 -4
  21. package/dist/{prod/locales/en-ZXYG7GCR.json → dev/locales/en-V6KXFSCK.json} +8 -1
  22. package/dist/excalidraw/actions/actionAlign.d.ts +7 -6
  23. package/dist/excalidraw/actions/actionAlign.js +14 -14
  24. package/dist/excalidraw/actions/actionClipboard.d.ts +7 -3
  25. package/dist/excalidraw/actions/actionDeleteSelected.d.ts +7 -3
  26. package/dist/excalidraw/actions/actionDeleteSelected.js +103 -34
  27. package/dist/excalidraw/actions/actionDuplicateSelection.js +105 -95
  28. package/dist/excalidraw/actions/actionFlip.js +16 -7
  29. package/dist/excalidraw/actions/actionFrame.d.ts +493 -0
  30. package/dist/excalidraw/actions/actionFrame.js +45 -2
  31. package/dist/excalidraw/actions/actionGroup.js +6 -4
  32. package/dist/excalidraw/actions/actionProperties.js +145 -116
  33. package/dist/excalidraw/actions/actionSelectAll.js +4 -3
  34. package/dist/excalidraw/actions/shortcuts.d.ts +1 -1
  35. package/dist/excalidraw/actions/shortcuts.js +1 -0
  36. package/dist/excalidraw/actions/types.d.ts +1 -1
  37. package/dist/excalidraw/align.d.ts +2 -1
  38. package/dist/excalidraw/align.js +15 -6
  39. package/dist/excalidraw/clipboard.d.ts +27 -5
  40. package/dist/excalidraw/clipboard.js +55 -28
  41. package/dist/excalidraw/components/Actions.d.ts +2 -1
  42. package/dist/excalidraw/components/Actions.js +4 -2
  43. package/dist/excalidraw/components/ActiveConfirmDialog.d.ts +1 -1
  44. package/dist/excalidraw/components/ActiveConfirmDialog.js +2 -3
  45. package/dist/excalidraw/components/App.d.ts +1 -0
  46. package/dist/excalidraw/components/App.js +216 -111
  47. package/dist/excalidraw/components/ColorPicker/ColorInput.js +2 -3
  48. package/dist/excalidraw/components/ColorPicker/ColorPicker.js +2 -3
  49. package/dist/excalidraw/components/ColorPicker/CustomColorList.js +1 -1
  50. package/dist/excalidraw/components/ColorPicker/Picker.js +1 -1
  51. package/dist/excalidraw/components/ColorPicker/PickerColorList.js +1 -1
  52. package/dist/excalidraw/components/ColorPicker/ShadeList.js +1 -1
  53. package/dist/excalidraw/components/ColorPicker/colorPickerUtils.d.ts +1 -1
  54. package/dist/excalidraw/components/ColorPicker/colorPickerUtils.js +1 -1
  55. package/dist/excalidraw/components/CommandPalette/CommandPalette.js +3 -3
  56. package/dist/excalidraw/components/ConfirmDialog.js +17 -5
  57. package/dist/excalidraw/components/Dialog.js +2 -3
  58. package/dist/excalidraw/components/EyeDropper.d.ts +1 -1
  59. package/dist/excalidraw/components/EyeDropper.js +1 -1
  60. package/dist/excalidraw/components/IconPicker.d.ts +2 -2
  61. package/dist/excalidraw/components/IconPicker.js +56 -53
  62. package/dist/excalidraw/components/LayerUI.js +6 -6
  63. package/dist/excalidraw/components/LibraryMenu.d.ts +2 -16
  64. package/dist/excalidraw/components/LibraryMenu.js +70 -28
  65. package/dist/excalidraw/components/LibraryMenuHeaderContent.js +4 -5
  66. package/dist/excalidraw/components/MobileMenu.js +1 -1
  67. package/dist/excalidraw/components/OverwriteConfirm/OverwriteConfirm.js +2 -3
  68. package/dist/excalidraw/components/OverwriteConfirm/OverwriteConfirmState.d.ts +1 -1
  69. package/dist/excalidraw/components/OverwriteConfirm/OverwriteConfirmState.js +2 -3
  70. package/dist/excalidraw/components/Range.d.ts +9 -0
  71. package/dist/excalidraw/components/Range.js +24 -0
  72. package/dist/excalidraw/components/SearchMenu.d.ts +1 -1
  73. package/dist/excalidraw/components/SearchMenu.js +3 -4
  74. package/dist/excalidraw/components/Sidebar/Sidebar.d.ts +1 -1
  75. package/dist/excalidraw/components/Sidebar/Sidebar.js +2 -3
  76. package/dist/excalidraw/components/Stats/Collapsible.d.ts +2 -1
  77. package/dist/excalidraw/components/Stats/Collapsible.js +2 -2
  78. package/dist/excalidraw/components/Stats/Dimension.js +94 -8
  79. package/dist/excalidraw/components/Stats/MultiDimension.js +8 -5
  80. package/dist/excalidraw/components/Stats/Position.js +63 -3
  81. package/dist/excalidraw/components/Stats/index.js +21 -4
  82. package/dist/excalidraw/components/Stats/utils.d.ts +1 -1
  83. package/dist/excalidraw/components/Stats/utils.js +2 -55
  84. package/dist/excalidraw/components/TTDDialog/TTDDialog.js +1 -1
  85. package/dist/excalidraw/components/ToolButton.js +4 -9
  86. package/dist/excalidraw/components/hoc/withInternalFallback.js +3 -3
  87. package/dist/excalidraw/components/hyperlink/Hyperlink.js +6 -12
  88. package/dist/excalidraw/components/icons.d.ts +9 -0
  89. package/dist/excalidraw/components/icons.js +4 -4
  90. package/dist/excalidraw/components/main-menu/DefaultItems.js +2 -3
  91. package/dist/excalidraw/constants.d.ts +5 -1
  92. package/dist/excalidraw/constants.js +9 -1
  93. package/dist/excalidraw/context/tunnels.d.ts +2 -1
  94. package/dist/excalidraw/context/tunnels.js +3 -1
  95. package/dist/excalidraw/data/blob.d.ts +1 -0
  96. package/dist/excalidraw/data/blob.js +7 -3
  97. package/dist/excalidraw/data/filesystem.d.ts +2 -1
  98. package/dist/excalidraw/data/filesystem.js +1 -0
  99. package/dist/excalidraw/data/image.d.ts +0 -6
  100. package/dist/excalidraw/data/image.js +1 -43
  101. package/dist/excalidraw/data/index.js +6 -6
  102. package/dist/excalidraw/data/library.d.ts +9 -3
  103. package/dist/excalidraw/data/library.js +43 -6
  104. package/dist/excalidraw/data/restore.js +26 -8
  105. package/dist/excalidraw/data/url.d.ts +0 -1
  106. package/dist/excalidraw/data/url.js +2 -4
  107. package/dist/excalidraw/editor-jotai.d.ts +56 -0
  108. package/dist/excalidraw/editor-jotai.js +8 -0
  109. package/dist/excalidraw/element/binding.d.ts +9 -6
  110. package/dist/excalidraw/element/binding.js +124 -44
  111. package/dist/excalidraw/element/bounds.js +10 -0
  112. package/dist/excalidraw/element/cropElement.d.ts +5 -0
  113. package/dist/excalidraw/element/cropElement.js +28 -1
  114. package/dist/excalidraw/element/dragElements.js +13 -7
  115. package/dist/excalidraw/element/elbowArrow.d.ts +16 -0
  116. package/dist/excalidraw/element/elbowArrow.js +1268 -0
  117. package/dist/excalidraw/element/embeddable.js +4 -5
  118. package/dist/excalidraw/element/flowchart.d.ts +1 -1
  119. package/dist/excalidraw/element/flowchart.js +25 -9
  120. package/dist/excalidraw/element/heading.d.ts +5 -1
  121. package/dist/excalidraw/element/heading.js +5 -1
  122. package/dist/excalidraw/element/image.js +19 -5
  123. package/dist/excalidraw/element/linearElementEditor.d.ts +9 -10
  124. package/dist/excalidraw/element/linearElementEditor.js +97 -38
  125. package/dist/excalidraw/element/mutateElement.d.ts +3 -1
  126. package/dist/excalidraw/element/mutateElement.js +31 -4
  127. package/dist/excalidraw/element/newElement.d.ts +8 -12
  128. package/dist/excalidraw/element/newElement.js +36 -21
  129. package/dist/excalidraw/element/resizeElements.d.ts +20 -5
  130. package/dist/excalidraw/element/resizeElements.js +593 -361
  131. package/dist/excalidraw/element/sortElements.js +1 -4
  132. package/dist/excalidraw/element/types.d.ts +23 -1
  133. package/dist/excalidraw/fonts/Fonts.d.ts +0 -16
  134. package/dist/excalidraw/fonts/Fonts.js +6 -31
  135. package/dist/excalidraw/frame.d.ts +11 -5
  136. package/dist/excalidraw/frame.js +146 -35
  137. package/dist/excalidraw/groups.js +3 -0
  138. package/dist/excalidraw/hooks/useLibraryItemSvg.d.ts +1 -1
  139. package/dist/excalidraw/hooks/useLibraryItemSvg.js +2 -3
  140. package/dist/excalidraw/hooks/useScrollPosition.js +1 -1
  141. package/dist/excalidraw/i18n.js +3 -4
  142. package/dist/excalidraw/index.js +3 -4
  143. package/dist/excalidraw/locales/en.json +8 -1
  144. package/dist/excalidraw/renderer/interactiveScene.js +43 -32
  145. package/dist/excalidraw/renderer/staticScene.js +6 -4
  146. package/dist/excalidraw/renderer/staticSvgScene.js +1 -1
  147. package/dist/excalidraw/scene/Shape.js +40 -17
  148. package/dist/excalidraw/scene/comparisons.d.ts +0 -477
  149. package/dist/excalidraw/scene/comparisons.js +0 -37
  150. package/dist/excalidraw/scene/export.d.ts +7 -0
  151. package/dist/excalidraw/scene/export.js +107 -43
  152. package/dist/excalidraw/scene/index.d.ts +1 -1
  153. package/dist/excalidraw/scene/index.js +1 -1
  154. package/dist/excalidraw/scene/selection.js +4 -1
  155. package/dist/excalidraw/types.d.ts +15 -0
  156. package/dist/excalidraw/utility-types.d.ts +1 -0
  157. package/dist/excalidraw/utils.d.ts +8 -1
  158. package/dist/excalidraw/utils.js +9 -0
  159. package/dist/excalidraw/visualdebug.d.ts +8 -1
  160. package/dist/excalidraw/visualdebug.js +3 -0
  161. package/dist/math/line.d.ts +19 -0
  162. package/dist/math/line.js +32 -3
  163. package/dist/math/point.d.ts +10 -0
  164. package/dist/math/point.js +12 -1
  165. package/dist/prod/index.css +1 -1
  166. package/dist/prod/index.js +29 -44
  167. package/dist/{dev/locales/en-ZXYG7GCR.json → prod/locales/en-V6KXFSCK.json} +8 -1
  168. package/package.json +5 -2
  169. package/dist/browser/dev/excalidraw-assets-dev/chunk-JGDL4H2X.js.map +0 -7
  170. package/dist/browser/dev/excalidraw-assets-dev/chunk-V7NFEZA6.js.map +0 -7
  171. package/dist/browser/prod/excalidraw-assets/chunk-S2XKB3DE.js +0 -62
  172. package/dist/browser/prod/excalidraw-assets/image-OFI2YYMP.js +0 -1
  173. package/dist/excalidraw/element/routing.d.ts +0 -12
  174. package/dist/excalidraw/element/routing.js +0 -642
  175. package/dist/excalidraw/jotai.d.ts +0 -34
  176. package/dist/excalidraw/jotai.js +0 -18
  177. /package/dist/browser/dev/excalidraw-assets-dev/{en-ZSVWGT55.js.map → en-7IBTMWBG.js.map} +0 -0
  178. /package/dist/browser/dev/excalidraw-assets-dev/{image-RJG3J34Y.js.map → image-N5AC7SEK.js.map} +0 -0
@@ -758,3 +758,496 @@ export declare const actionSetFrameAsActiveTool: {
758
758
  } & {
759
759
  keyTest?: ((event: KeyboardEvent | import("react").KeyboardEvent<Element>) => boolean) | undefined;
760
760
  };
761
+ export declare const actionWrapSelectionInFrame: {
762
+ name: "wrapSelectionInFrame";
763
+ label: string;
764
+ trackEvent: {
765
+ category: "element";
766
+ };
767
+ predicate: (elements: readonly ExcalidrawElement[], appState: AppState, _: import("../types").ExcalidrawProps, app: AppClassProperties) => boolean;
768
+ perform: (elements: readonly import("../element/types").OrderedExcalidrawElement[], appState: Readonly<AppState>, _: any, app: AppClassProperties) => {
769
+ elements: (import("../element/types").NonDeleted<import("../element/types").ExcalidrawFrameElement> | (Readonly<{
770
+ id: string;
771
+ x: number;
772
+ y: number;
773
+ strokeColor: string;
774
+ backgroundColor: string;
775
+ fillStyle: import("../element/types").FillStyle;
776
+ strokeWidth: number;
777
+ strokeStyle: import("../element/types").StrokeStyle;
778
+ roundness: {
779
+ type: import("../element/types").RoundnessType;
780
+ value?: number | undefined;
781
+ } | null;
782
+ roughness: number;
783
+ opacity: number;
784
+ width: number;
785
+ height: number;
786
+ angle: import("../../math").Radians;
787
+ seed: number;
788
+ version: number;
789
+ versionNonce: number;
790
+ index: import("../element/types").FractionalIndex | null;
791
+ isDeleted: boolean;
792
+ groupIds: readonly string[];
793
+ frameId: string | null;
794
+ boundElements: readonly Readonly<{
795
+ id: string;
796
+ type: "text" | "arrow";
797
+ }>[] | null;
798
+ updated: number;
799
+ link: string | null;
800
+ locked: boolean;
801
+ customData?: Record<string, any> | undefined;
802
+ }> & {
803
+ type: "selection";
804
+ } & {
805
+ index: import("../element/types").FractionalIndex;
806
+ }) | (Readonly<{
807
+ id: string;
808
+ x: number;
809
+ y: number;
810
+ strokeColor: string;
811
+ backgroundColor: string;
812
+ fillStyle: import("../element/types").FillStyle;
813
+ strokeWidth: number;
814
+ strokeStyle: import("../element/types").StrokeStyle;
815
+ roundness: {
816
+ type: import("../element/types").RoundnessType;
817
+ value?: number | undefined;
818
+ } | null;
819
+ roughness: number;
820
+ opacity: number;
821
+ width: number;
822
+ height: number;
823
+ angle: import("../../math").Radians;
824
+ seed: number;
825
+ version: number;
826
+ versionNonce: number;
827
+ index: import("../element/types").FractionalIndex | null;
828
+ isDeleted: boolean;
829
+ groupIds: readonly string[];
830
+ frameId: string | null;
831
+ boundElements: readonly Readonly<{
832
+ id: string;
833
+ type: "text" | "arrow";
834
+ }>[] | null;
835
+ updated: number;
836
+ link: string | null;
837
+ locked: boolean;
838
+ customData?: Record<string, any> | undefined;
839
+ }> & {
840
+ type: "rectangle";
841
+ } & {
842
+ index: import("../element/types").FractionalIndex;
843
+ }) | (Readonly<{
844
+ id: string;
845
+ x: number;
846
+ y: number;
847
+ strokeColor: string;
848
+ backgroundColor: string;
849
+ fillStyle: import("../element/types").FillStyle;
850
+ strokeWidth: number;
851
+ strokeStyle: import("../element/types").StrokeStyle;
852
+ roundness: {
853
+ type: import("../element/types").RoundnessType;
854
+ value?: number | undefined;
855
+ } | null;
856
+ roughness: number;
857
+ opacity: number;
858
+ width: number;
859
+ height: number;
860
+ angle: import("../../math").Radians;
861
+ seed: number;
862
+ version: number;
863
+ versionNonce: number;
864
+ index: import("../element/types").FractionalIndex | null;
865
+ isDeleted: boolean;
866
+ groupIds: readonly string[];
867
+ frameId: string | null;
868
+ boundElements: readonly Readonly<{
869
+ id: string;
870
+ type: "text" | "arrow";
871
+ }>[] | null;
872
+ updated: number;
873
+ link: string | null;
874
+ locked: boolean;
875
+ customData?: Record<string, any> | undefined;
876
+ }> & {
877
+ type: "diamond";
878
+ } & {
879
+ index: import("../element/types").FractionalIndex;
880
+ }) | (Readonly<{
881
+ id: string;
882
+ x: number;
883
+ y: number;
884
+ strokeColor: string;
885
+ backgroundColor: string;
886
+ fillStyle: import("../element/types").FillStyle;
887
+ strokeWidth: number;
888
+ strokeStyle: import("../element/types").StrokeStyle;
889
+ roundness: {
890
+ type: import("../element/types").RoundnessType;
891
+ value?: number | undefined;
892
+ } | null;
893
+ roughness: number;
894
+ opacity: number;
895
+ width: number;
896
+ height: number;
897
+ angle: import("../../math").Radians;
898
+ seed: number;
899
+ version: number;
900
+ versionNonce: number;
901
+ index: import("../element/types").FractionalIndex | null;
902
+ isDeleted: boolean;
903
+ groupIds: readonly string[];
904
+ frameId: string | null;
905
+ boundElements: readonly Readonly<{
906
+ id: string;
907
+ type: "text" | "arrow";
908
+ }>[] | null;
909
+ updated: number;
910
+ link: string | null;
911
+ locked: boolean;
912
+ customData?: Record<string, any> | undefined;
913
+ }> & {
914
+ type: "ellipse";
915
+ } & {
916
+ index: import("../element/types").FractionalIndex;
917
+ }) | (Readonly<{
918
+ id: string;
919
+ x: number;
920
+ y: number;
921
+ strokeColor: string;
922
+ backgroundColor: string;
923
+ fillStyle: import("../element/types").FillStyle;
924
+ strokeWidth: number;
925
+ strokeStyle: import("../element/types").StrokeStyle;
926
+ roundness: {
927
+ type: import("../element/types").RoundnessType;
928
+ value?: number | undefined;
929
+ } | null;
930
+ roughness: number;
931
+ opacity: number;
932
+ width: number;
933
+ height: number;
934
+ angle: import("../../math").Radians;
935
+ seed: number;
936
+ version: number;
937
+ versionNonce: number;
938
+ index: import("../element/types").FractionalIndex | null;
939
+ isDeleted: boolean;
940
+ groupIds: readonly string[];
941
+ frameId: string | null;
942
+ boundElements: readonly Readonly<{
943
+ id: string;
944
+ type: "text" | "arrow";
945
+ }>[] | null;
946
+ updated: number;
947
+ link: string | null;
948
+ locked: boolean;
949
+ customData?: Record<string, any> | undefined;
950
+ }> & Readonly<{
951
+ type: "text";
952
+ fontSize: number;
953
+ fontFamily: number;
954
+ text: string;
955
+ textAlign: string;
956
+ verticalAlign: string;
957
+ containerId: string | null;
958
+ originalText: string;
959
+ autoResize: boolean;
960
+ lineHeight: number & {
961
+ _brand: "unitlessLineHeight";
962
+ };
963
+ }> & {
964
+ index: import("../element/types").FractionalIndex;
965
+ }) | (Readonly<{
966
+ id: string;
967
+ x: number;
968
+ y: number;
969
+ strokeColor: string;
970
+ backgroundColor: string;
971
+ fillStyle: import("../element/types").FillStyle;
972
+ strokeWidth: number;
973
+ strokeStyle: import("../element/types").StrokeStyle;
974
+ roundness: {
975
+ type: import("../element/types").RoundnessType;
976
+ value?: number | undefined;
977
+ } | null;
978
+ roughness: number;
979
+ opacity: number;
980
+ width: number;
981
+ height: number;
982
+ angle: import("../../math").Radians;
983
+ seed: number;
984
+ version: number;
985
+ versionNonce: number;
986
+ index: import("../element/types").FractionalIndex | null;
987
+ isDeleted: boolean;
988
+ groupIds: readonly string[];
989
+ frameId: string | null;
990
+ boundElements: readonly Readonly<{
991
+ id: string;
992
+ type: "text" | "arrow";
993
+ }>[] | null;
994
+ updated: number;
995
+ link: string | null;
996
+ locked: boolean;
997
+ customData?: Record<string, any> | undefined;
998
+ }> & Readonly<{
999
+ type: "line" | "arrow";
1000
+ points: readonly import("../../math").LocalPoint[];
1001
+ lastCommittedPoint: import("../../math").LocalPoint | null;
1002
+ startBinding: import("../element/types").PointBinding | null;
1003
+ endBinding: import("../element/types").PointBinding | null;
1004
+ startArrowhead: import("../element/types").Arrowhead | null;
1005
+ endArrowhead: import("../element/types").Arrowhead | null;
1006
+ }> & {
1007
+ index: import("../element/types").FractionalIndex;
1008
+ }) | (Readonly<{
1009
+ id: string;
1010
+ x: number;
1011
+ y: number;
1012
+ strokeColor: string;
1013
+ backgroundColor: string;
1014
+ fillStyle: import("../element/types").FillStyle;
1015
+ strokeWidth: number;
1016
+ strokeStyle: import("../element/types").StrokeStyle;
1017
+ roundness: {
1018
+ type: import("../element/types").RoundnessType;
1019
+ value?: number | undefined;
1020
+ } | null;
1021
+ roughness: number;
1022
+ opacity: number;
1023
+ width: number;
1024
+ height: number;
1025
+ angle: import("../../math").Radians;
1026
+ seed: number;
1027
+ version: number;
1028
+ versionNonce: number;
1029
+ index: import("../element/types").FractionalIndex | null;
1030
+ isDeleted: boolean;
1031
+ groupIds: readonly string[];
1032
+ frameId: string | null;
1033
+ boundElements: readonly Readonly<{
1034
+ id: string;
1035
+ type: "text" | "arrow";
1036
+ }>[] | null;
1037
+ updated: number;
1038
+ link: string | null;
1039
+ locked: boolean;
1040
+ customData?: Record<string, any> | undefined;
1041
+ }> & Readonly<{
1042
+ type: "freedraw";
1043
+ points: readonly import("../../math").LocalPoint[];
1044
+ pressures: readonly number[];
1045
+ simulatePressure: boolean;
1046
+ lastCommittedPoint: import("../../math").LocalPoint | null;
1047
+ }> & {
1048
+ index: import("../element/types").FractionalIndex;
1049
+ }) | (Readonly<{
1050
+ id: string;
1051
+ x: number;
1052
+ y: number;
1053
+ strokeColor: string;
1054
+ backgroundColor: string;
1055
+ fillStyle: import("../element/types").FillStyle;
1056
+ strokeWidth: number;
1057
+ strokeStyle: import("../element/types").StrokeStyle;
1058
+ roundness: {
1059
+ type: import("../element/types").RoundnessType;
1060
+ value?: number | undefined;
1061
+ } | null;
1062
+ roughness: number;
1063
+ opacity: number;
1064
+ width: number;
1065
+ height: number;
1066
+ angle: import("../../math").Radians;
1067
+ seed: number;
1068
+ version: number;
1069
+ versionNonce: number;
1070
+ index: import("../element/types").FractionalIndex | null;
1071
+ isDeleted: boolean;
1072
+ groupIds: readonly string[];
1073
+ frameId: string | null;
1074
+ boundElements: readonly Readonly<{
1075
+ id: string;
1076
+ type: "text" | "arrow";
1077
+ }>[] | null;
1078
+ updated: number;
1079
+ link: string | null;
1080
+ locked: boolean;
1081
+ customData?: Record<string, any> | undefined;
1082
+ }> & Readonly<{
1083
+ type: "image";
1084
+ fileId: import("../element/types").FileId | null;
1085
+ status: "pending" | "saved" | "error";
1086
+ scale: [number, number];
1087
+ crop: import("../element/types").ImageCrop | null;
1088
+ }> & {
1089
+ index: import("../element/types").FractionalIndex;
1090
+ }) | (Readonly<{
1091
+ id: string;
1092
+ x: number;
1093
+ y: number;
1094
+ strokeColor: string;
1095
+ backgroundColor: string;
1096
+ fillStyle: import("../element/types").FillStyle;
1097
+ strokeWidth: number;
1098
+ strokeStyle: import("../element/types").StrokeStyle;
1099
+ roundness: {
1100
+ type: import("../element/types").RoundnessType;
1101
+ value?: number | undefined;
1102
+ } | null;
1103
+ roughness: number;
1104
+ opacity: number;
1105
+ width: number;
1106
+ height: number;
1107
+ angle: import("../../math").Radians;
1108
+ seed: number;
1109
+ version: number;
1110
+ versionNonce: number;
1111
+ index: import("../element/types").FractionalIndex | null;
1112
+ isDeleted: boolean;
1113
+ groupIds: readonly string[];
1114
+ frameId: string | null;
1115
+ boundElements: readonly Readonly<{
1116
+ id: string;
1117
+ type: "text" | "arrow";
1118
+ }>[] | null;
1119
+ updated: number;
1120
+ link: string | null;
1121
+ locked: boolean;
1122
+ customData?: Record<string, any> | undefined;
1123
+ }> & {
1124
+ type: "frame";
1125
+ name: string | null;
1126
+ } & {
1127
+ index: import("../element/types").FractionalIndex;
1128
+ }) | (Readonly<{
1129
+ id: string;
1130
+ x: number;
1131
+ y: number;
1132
+ strokeColor: string;
1133
+ backgroundColor: string;
1134
+ fillStyle: import("../element/types").FillStyle;
1135
+ strokeWidth: number;
1136
+ strokeStyle: import("../element/types").StrokeStyle;
1137
+ roundness: {
1138
+ type: import("../element/types").RoundnessType;
1139
+ value?: number | undefined;
1140
+ } | null;
1141
+ roughness: number;
1142
+ opacity: number;
1143
+ width: number;
1144
+ height: number;
1145
+ angle: import("../../math").Radians;
1146
+ seed: number;
1147
+ version: number;
1148
+ versionNonce: number;
1149
+ index: import("../element/types").FractionalIndex | null;
1150
+ isDeleted: boolean;
1151
+ groupIds: readonly string[];
1152
+ frameId: string | null;
1153
+ boundElements: readonly Readonly<{
1154
+ id: string;
1155
+ type: "text" | "arrow";
1156
+ }>[] | null;
1157
+ updated: number;
1158
+ link: string | null;
1159
+ locked: boolean;
1160
+ customData?: Record<string, any> | undefined;
1161
+ }> & {
1162
+ type: "magicframe";
1163
+ name: string | null;
1164
+ } & {
1165
+ index: import("../element/types").FractionalIndex;
1166
+ }) | (Readonly<{
1167
+ id: string;
1168
+ x: number;
1169
+ y: number;
1170
+ strokeColor: string;
1171
+ backgroundColor: string;
1172
+ fillStyle: import("../element/types").FillStyle;
1173
+ strokeWidth: number;
1174
+ strokeStyle: import("../element/types").StrokeStyle;
1175
+ roundness: {
1176
+ type: import("../element/types").RoundnessType;
1177
+ value?: number | undefined;
1178
+ } | null;
1179
+ roughness: number;
1180
+ opacity: number;
1181
+ width: number;
1182
+ height: number;
1183
+ angle: import("../../math").Radians;
1184
+ seed: number;
1185
+ version: number;
1186
+ versionNonce: number;
1187
+ index: import("../element/types").FractionalIndex | null;
1188
+ isDeleted: boolean;
1189
+ groupIds: readonly string[];
1190
+ frameId: string | null;
1191
+ boundElements: readonly Readonly<{
1192
+ id: string;
1193
+ type: "text" | "arrow";
1194
+ }>[] | null;
1195
+ updated: number;
1196
+ link: string | null;
1197
+ locked: boolean;
1198
+ customData?: Record<string, any> | undefined;
1199
+ }> & Readonly<{
1200
+ type: "iframe";
1201
+ customData?: {
1202
+ generationData?: import("../element/types").MagicGenerationData | undefined;
1203
+ } | undefined;
1204
+ }> & {
1205
+ index: import("../element/types").FractionalIndex;
1206
+ }) | (Readonly<{
1207
+ id: string;
1208
+ x: number;
1209
+ y: number;
1210
+ strokeColor: string;
1211
+ backgroundColor: string;
1212
+ fillStyle: import("../element/types").FillStyle;
1213
+ strokeWidth: number;
1214
+ strokeStyle: import("../element/types").StrokeStyle;
1215
+ roundness: {
1216
+ type: import("../element/types").RoundnessType;
1217
+ value?: number | undefined;
1218
+ } | null;
1219
+ roughness: number;
1220
+ opacity: number;
1221
+ width: number;
1222
+ height: number;
1223
+ angle: import("../../math").Radians;
1224
+ seed: number;
1225
+ version: number;
1226
+ versionNonce: number;
1227
+ index: import("../element/types").FractionalIndex | null;
1228
+ isDeleted: boolean;
1229
+ groupIds: readonly string[];
1230
+ frameId: string | null;
1231
+ boundElements: readonly Readonly<{
1232
+ id: string;
1233
+ type: "text" | "arrow";
1234
+ }>[] | null;
1235
+ updated: number;
1236
+ link: string | null;
1237
+ locked: boolean;
1238
+ customData?: Record<string, any> | undefined;
1239
+ }> & Readonly<{
1240
+ type: "embeddable";
1241
+ }> & {
1242
+ index: import("../element/types").FractionalIndex;
1243
+ }))[];
1244
+ appState: {
1245
+ selectedElementIds: {
1246
+ [x: string]: true;
1247
+ };
1248
+ };
1249
+ storeAction: "capture";
1250
+ };
1251
+ } & {
1252
+ keyTest?: undefined;
1253
+ };
@@ -1,5 +1,5 @@
1
- import { getNonDeletedElements } from "../element";
2
- import { removeAllElementsFromFrame } from "../frame";
1
+ import { getCommonBounds, getNonDeletedElements } from "../element";
2
+ import { addElementsToFrame, removeAllElementsFromFrame } from "../frame";
3
3
  import { getFrameChildren } from "../frame";
4
4
  import { KEYS } from "../keys";
5
5
  import { updateActiveTool } from "../utils";
@@ -8,6 +8,10 @@ import { register } from "./register";
8
8
  import { isFrameLikeElement } from "../element/typeChecks";
9
9
  import { frameToolIcon } from "../components/icons";
10
10
  import { StoreAction } from "../store";
11
+ import { getSelectedElements } from "../scene";
12
+ import { newFrameElement } from "../element/newElement";
13
+ import { getElementsInGroup } from "../groups";
14
+ import { mutateElement } from "../element/mutateElement";
11
15
  const isSingleFrameSelected = (appState, app) => {
12
16
  const selectedElements = app.scene.getSelectedElements(appState);
13
17
  return (selectedElements.length === 1 && isFrameLikeElement(selectedElements[0]));
@@ -116,3 +120,42 @@ export const actionSetFrameAsActiveTool = register({
116
120
  !event.altKey &&
117
121
  event.key.toLocaleLowerCase() === KEYS.F,
118
122
  });
123
+ export const actionWrapSelectionInFrame = register({
124
+ name: "wrapSelectionInFrame",
125
+ label: "labels.wrapSelectionInFrame",
126
+ trackEvent: { category: "element" },
127
+ predicate: (elements, appState, _, app) => {
128
+ const selectedElements = getSelectedElements(elements, appState);
129
+ return (selectedElements.length > 0 &&
130
+ !selectedElements.some((element) => isFrameLikeElement(element)));
131
+ },
132
+ perform: (elements, appState, _, app) => {
133
+ const selectedElements = getSelectedElements(elements, appState);
134
+ const [x1, y1, x2, y2] = getCommonBounds(selectedElements, app.scene.getNonDeletedElementsMap());
135
+ const PADDING = 16;
136
+ const frame = newFrameElement({
137
+ x: x1 - PADDING,
138
+ y: y1 - PADDING,
139
+ width: x2 - x1 + PADDING * 2,
140
+ height: y2 - y1 + PADDING * 2,
141
+ });
142
+ // for a selected partial group, we want to remove it from the remainder of the group
143
+ if (appState.editingGroupId) {
144
+ const elementsInGroup = getElementsInGroup(selectedElements, appState.editingGroupId);
145
+ for (const elementInGroup of elementsInGroup) {
146
+ const index = elementInGroup.groupIds.indexOf(appState.editingGroupId);
147
+ mutateElement(elementInGroup, {
148
+ groupIds: elementInGroup.groupIds.slice(0, index),
149
+ }, false);
150
+ }
151
+ }
152
+ const nextElements = addElementsToFrame([...app.scene.getElementsIncludingDeleted(), frame], selectedElements, frame, appState);
153
+ return {
154
+ elements: nextElements,
155
+ appState: {
156
+ selectedElementIds: { [frame.id]: true },
157
+ },
158
+ storeAction: StoreAction.CAPTURE,
159
+ };
160
+ },
161
+ });
@@ -11,7 +11,7 @@ import { getNonDeletedElements } from "../element";
11
11
  import { randomId } from "../random";
12
12
  import { ToolButton } from "../components/ToolButton";
13
13
  import { isBoundToContainer } from "../element/typeChecks";
14
- import { getElementsInResizingFrame, getFrameLikeElements, groupByFrameLikes, removeElementsFromFrame, replaceAllElementsInFrame, } from "../frame";
14
+ import { frameAndChildrenSelectedTogether, getElementsInResizingFrame, getFrameLikeElements, getRootElements, groupByFrameLikes, removeElementsFromFrame, replaceAllElementsInFrame, } from "../frame";
15
15
  import { syncMovedIndices } from "../fractionalIndex";
16
16
  import { StoreAction } from "../store";
17
17
  const allElementsInSameGroup = (elements) => {
@@ -30,7 +30,9 @@ const enableActionGroup = (elements, appState, app) => {
30
30
  selectedElementIds: appState.selectedElementIds,
31
31
  includeBoundTextElement: true,
32
32
  });
33
- return (selectedElements.length >= 2 && !allElementsInSameGroup(selectedElements));
33
+ return (selectedElements.length >= 2 &&
34
+ !allElementsInSameGroup(selectedElements) &&
35
+ !frameAndChildrenSelectedTogether(selectedElements));
34
36
  };
35
37
  export const actionGroup = register({
36
38
  name: "group",
@@ -38,10 +40,10 @@ export const actionGroup = register({
38
40
  icon: (appState) => _jsx(GroupIcon, { theme: appState.theme }),
39
41
  trackEvent: { category: "element" },
40
42
  perform: (elements, appState, _, app) => {
41
- const selectedElements = app.scene.getSelectedElements({
43
+ const selectedElements = getRootElements(app.scene.getSelectedElements({
42
44
  selectedElementIds: appState.selectedElementIds,
43
45
  includeBoundTextElement: true,
44
- });
46
+ }));
45
47
  if (selectedElements.length < 2) {
46
48
  // nothing to group
47
49
  return { appState, elements, storeAction: StoreAction.NONE };